Ваша таблица стилей XSLT содержит ошибку - в соответствии с spec , любым дочерним элементом xsl:stylesheet
(он же элемент верхнего уровня) ) должно быть в ненулевом пространстве имен:
"* Кроме того, таблица стилей xsl:
элемент может содержать любой элемент не
из пространства имен XSLT, при условии, что
расширенное имя элемента имеет
ненулевой URI пространства имен. «
Если процессор XSLT, который вы используете, не вызывает ошибку, значит, он несовместим и содержит ошибки и не должен использоваться. Найдите и используйте совместимый XSLT-процессор (я использую .NET XslCompiledTransform, Saxon 6.5.5, ... и т. Д.).
Есть и другие ошибки.
Решение
Определите новое пространство имен с префиксом (скажем) "x:":
Измените встроенный <classifications>
на <x:classifications>
- теперь это соответствует спецификации.
Вносите дополнительные изменения в код, пока не получите это преобразование:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="my:x" exclude-result-prefixes="x">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="classification-lookup" match="classification"
use="id" />
<xsl:template match="BusinessListing">
<listing>
<id>
<xsl:value-of select="id" />
</id>
<xsl:apply-templates/>
</listing>
</xsl:template>
<xsl:template match="classificationId">
<xsl:variable name="vCur" select="."/>
<xsl:for-each select="document('')">
<category>
<xsl:value-of select=
"key('classification-lookup',$vCur)/description" />
</category>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()"/>
<x:classifications>
<classification>
<id>7981</id>
<description>Category1</description>
</classification>
<classification>
<id>7982</id>
<description>Category2</description>
</classification>
<classification>
<id>7983</id>
<description>Category3</description>
</classification>
<classification>
<id>7984</id>
<description>Category4</description>
</classification>
</x:classifications>
</xsl:stylesheet>
0,4. В приведенном выше коде обратите внимание на строку: <xsl:for-each select="document('')">
.
Цель этого - сделать таблицу стилей текущим документом. Функция key()
работает только с текущим документом, и если вы хотите, чтобы внедренные элементы classification
были проиндексированы и использованы, вы должны изменить текущий документ (обычно таким образом). В XSLT 2.0 функция key()
допускает третий аргумент, который является узлом из документа, индекс которого должен использоваться.
Когда это преобразование применяется к предоставленному документу XML:
<BusinessListings>
<BusinessListing>
<id>1593469</id>
<listingData>
<classifications>
<classificationId>7982</classificationId>
<classificationId>7983</classificationId>
</classifications>
</listingData>
</BusinessListing>
</BusinessListings>
желаемый, правильный результат получается:
<listing>
<id>1593469</id>
<category>Category2</category>
<category>Category3</category>
</listing>