Создание XSL из XML. Особенность работы при наличии пространств имен
Имеется документ xml, в тегах которого есть много зависимостей:
<?xml version="1.0" encoding="UTF-8"?>
<ZoneToGKN
xmlns:Simple1="urn://x-artefacts-rosreestr-ru/commons/simple-types/1.0"
xmlns:adrInp2="urn://x-artefacts-rosreestr-ru/commons/complex-types/address-input/6.0.1"
xmlns:tns="urn://x-artefacts-smev-gov-ru/supplementary/commons/1.0.1"
xmlns:Org4="urn://x-artefacts-rosreestr-ru/commons/complex-types/organization/4.0.1"
xmlns:Person1="urn://x-artefacts-rosreestr-ru/commons/complex-types/person/5.0.2"
xmlns:Gov5="urn://x-artefacts-rosreestr-ru/commons/complex-types/governance/5.0.1"
xmlns:Simple4="urn://x-artefacts-rosreestr-ru/commons/simple-types/4.1.1"
xmlns:dAp1="urn://x-artefacts-rosreestr-ru/commons/directories/applied-file/1.0.1"
xmlns:dAl3="urn://x-artefacts-rosreestr-ru/commons/directories/all-documents/3.0.2"
xmlns:dEcZ1="urn://x-artefacts-rosreestr-ru/commons/directories/economic-zone/1.0.1"
xmlns:Sen5="urn://x-artefacts-rosreestr-ru/commons/complex-types/sender/5.0.1"
xmlns:DocI3="urn://x-artefacts-rosreestr-ru/commons/complex-types/document-info/5.0.1"
xmlns:Simple10="urn://x-artefacts-rosreestr-ru/commons/simple-types/10.0.1"
xmlns="urn://x-artefacts-rosreestr-ru/incoming/zone-to-gkn/5.0.8"
xmlns:zone4="urn://x-artefacts-rosreestr-ru/commons/complex-types/zone/4.2.2"
NameSoftware="Полигон Про"
VersionSoftware="5.1.0.11"
GUID="8b4470f6-8543-447f-bb63-48df27c31806"
>
<Title>
<DocI3:CodeDocument>558221040000</DocI3:CodeDocument>
<DocI3:Number>б/н</DocI3:Number>
<DocI3:Date>2019-11-20</DocI3:Date>
<DocI3:IssueOrgan>Комитет по охране объектов культурного наследия Ростовской области</DocI3:IssueOrgan>
</Title>
...
</ZoneToGKN>
Моя задача сформировать xsl документ для преобразования xml в таблицу.
Все мои попытки не принесли результата
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:Simple1="urn://x-artefacts-rosreestr-ru/commons/simple-types/1.0"
xmlns:adrInp2="urn://x-artefacts-rosreestr-ru/commons/complex-types/address-input/6.0.1"
xmlns:tns="urn://x-artefacts-smev-gov-ru/supplementary/commons/1.0.1"
xmlns:Org4="urn://x-artefacts-rosreestr-ru/commons/complex-types/organization/4.0.1"
xmlns:Person1="urn://x-artefacts-rosreestr-ru/commons/complex-types/person/5.0.2"
xmlns:Gov5="urn://x-artefacts-rosreestr-ru/commons/complex-types/governance/5.0.1"
xmlns:Simple4="urn://x-artefacts-rosreestr-ru/commons/simple-types/4.1.1"
xmlns:dAp1="urn://x-artefacts-rosreestr-ru/commons/directories/applied-file/1.0.1"
xmlns:dAl3="urn://x-artefacts-rosreestr-ru/commons/directories/all-documents/3.0.2"
xmlns:dEcZ1="urn://x-artefacts-rosreestr-ru/commons/directories/economic-zone/1.0.1"
xmlns:Sen5="urn://x-artefacts-rosreestr-ru/commons/complex-types/sender/5.0.1"
xmlns:DocI3="urn://x-artefacts-rosreestr-ru/commons/complex-types/document-info/5.0.1"
xmlns:Simple10="urn://x-artefacts-rosreestr-ru/commons/simple-types/10.0.1"
xmlns="urn://x-artefacts-rosreestr-ru/incoming/zone-to-gkn/5.0.8"
xmlns:zone4="urn://x-artefacts-rosreestr-ru/commons/complex-types/zone/4.2.2">
<xsl:template match="/" >
<html>
<head>
<style type="text/css">
table { border-collapse: collapse; }
td, th { padding: 3px; border: 1px solid black; }
th { background: #9acd32; }
</style>
</head>
<body>
<table>
<tr>
<th>...</th>
<th>...</th>
<th>...</th>
<th>...</th>
<th>...</th>
</tr>
<xsl:apply-templates select="ZoneToGKN/Title" mode="all"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="Title" mode="all">
<!-- Основная геометрия и многоконтурные объекты-->
<tr>
<td><xsl:value-of select="DocI3:Date" /></td>
<td>Main</td>
</tr>
</xsl:template>
</xsl:stylesheet>
Подобный способ отлично работает на документах без DocI3:CodeDocument зависимостей. Подскажите, что я делаю неправильно?
Ответы (1 шт):
Вот эта строка
xmlns="urn://x-artefacts-rosreestr-ru/incoming/zone-to-gkn/5.0.8"
говорит, что все дочерние элементы и этот элемент, у которых не указан префикс пространства имена, находятся в пространстве имен urn://x-artefacts-rosreestr-ru/incoming/zone-to-gkn/5.0.8
Это интуитивно понятно для XML, а вот для XSL происходит следующее:
Вы пишете
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="urn://x-artefacts-rosreestr-ru/incoming/zone-to-gkn/5.0.8">
<html>
<xsl:value-of select="ZoneTKG"/>
</html>
</xsl:stylesheet>
Вы объявляете три элемента (XSL - это подмножество XML)
stylesheetв пространстве именhttp://www.w3.org/1999/XSL/Transformhtmlв пространстве именurn://x-artefacts-rosreestr-ru/incoming/zone-to-gkn/5.0.8value-ofв пространстве именhttp://www.w3.org/1999/XSL/Transform
При этом выборка элемента ZoneTKG происходит не из пространства имен по умолчанию, а их пустого пространства имен.
Что нужно сделать:
В xsl убрать пространство имен по умолчанию, а вместо этого определить префикс пространства имен
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ztg="urn://x-artefacts-rosreestr-ru/incoming/zone-to-gkn/5.0.8">имя префикса может быть любым и ого никак не коррелирует с префиксами исходного XML. Главное что оно должно быть уникальным в пределах текущего документа.
Обращение ко всем элементам, которые в исходном XML находятся в пространстве имен по умолчанию нужно осуществлять с применением этого префикса
<xsl:apply-templates select="ztg:ZoneToGKN/ztg:Title" mode="all"/> <xsl:template match="ztg:Title" mode="all"> ............ </xsl:template>