Проблема в том, что предоставленный код XSLT имеет пространство имен по умолчанию.
Следовательно, элементы <firstname>
, <lastname>
и <email>
находятся в пространстве имен xhtml.Но ссылка email
без префикса указана в:
exsl:node-set($person)/email
XPath считает все имена без префиксов находящимися в «пространстве имен».Он пытается найти дочерний элемент exsl:node-set($person)
с именем email
, который находится в «нет пространства имен», и это не удается, поскольку его дочерний элемент email
находится в пространстве имен xhtml.Таким образом, узел email
не выбирается и не выводится.
Решение :
Это преобразование:
<xsl:stylesheet version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:x="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="exsl x">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<html>
<p>Hello world</p>
<xsl:variable name="person">
<firstname>Foo</firstname>
<lastname>Bar</lastname>
<email>test@example.com</email>
</xsl:variable>
<xsl:text>
</xsl:text>
<xsl:value-of select="exsl:node-set($person)/x:email"/>
<xsl:text>
</xsl:text>
</html>
</xsl:template>
</xsl:stylesheet>
при применении к любомуXML-документ (не используется), дает желаемый результат :
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:x="http://www.w3.org/1999/xhtml">
<p>Hello world</p>
test@example.com
</html>
Примечание :
Добавлено определение пространства имен спрефикс x
Измененный атрибут select
<xsl:value-of>
:
exsl:node-set($person)/x:email