Я не уверен, что вы поняли, что и ваш ввод, и XSLT неверны, всегда лучше предоставить рабочие примеры.
В любом случае, если мы посмотрим на выражение XPath n:BasicDescription/n:RelatedMaterial/t:ContentProperties/t:ContentAttributes/t:Width
, которое вы используетепрефикс n
, который сопоставляется с urn:t:myfoo:2010
, но когда данные находятся в пространстве имен по умолчанию.То же самое касается префикса t
, который вообще не определен ни во входных данных, ни в XSLT.
Вам необходимо определить пространства имен на "обеих сторонах" в данных XML и преобразовании XSLTи они должны быть одинаковыми, не префиксы, а URI.
Возможно, кто-то другой мог бы объяснить это лучше меня.
Я исправил ваш пример и добавил несколько вещей ксделать эту работу.
Ввод:
<?xml version="1.0" encoding="UTF-8"?>
<Description
xmlns="urn:t:myfoo:2010"
xmlns:t="something...">
<Information>
<GroupInformation xml:lang="en">
<BasicDescription>
<RelatedMaterial>
<SomeText>Hello</SomeText>
<t:ContentProperties>
<t:ContentAttributes>
<t:Width>555</t:Width>
<t:Height>444</t:Height>
</t:ContentAttributes>
</t:ContentProperties>
</RelatedMaterial>
</BasicDescription>
</GroupInformation>
</Information>
</Description>
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:n="urn:t:myfoo:2010"
xmlns:t="something...">
<xsl:template match="/">
<xsl:apply-templates select="n:Description/n:Information/n:GroupInformation"/>
</xsl:template>
<xsl:template match="n:GroupInformation">
<xsl:element name="width">
<xsl:value-of select="n:BasicDescription/n:RelatedMaterial/t:ContentProperties/t:ContentAttributes/t:Width"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Выход:
<?xml version="1.0" encoding="UTF-8"?>
<width>555</width>