Doing exsl:node-set($products)
возвращает один узел документа, который содержит остальную часть XML в вашей переменной, так что вам нужно сделать это ...
<xsl:for-each select="exsl:node-set($products)/array/item">
Однако это не будетработать сразу, потому что вы определили объявление пространства имен по умолчанию в вашем XSLT (xmlns="http://www.w3.org/1999/xhtml"
).Это означает, что элементы в переменной, не имеющие префикса, будут находиться в этом пространстве имен.
Так что, если у вас нет причины иметь array
и item
в пространстве имен, объявите переменную следующим образом:
<xsl:variable name="products" xmlns="">
Попробуйте это XSLT
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"
xmlns:exsl="http://exslt.org/common"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="exsl"
version="1.0">
<xsl:variable name="products" xmlns="">
<array>
<item><name>Scooby</name><value>Doo</value></item>
<item><name>snack</name><value>cookies</value></item>
</array>
</xsl:variable>
<xsl:template match="/">
<xsl:for-each select="exsl:node-set($products)/array/item">
<xsl:value-of select="name" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
В качестве альтернативы, если вам нужно указать array
и item
в пространстве имен, вы можете обработать их следующим образом:
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:exsl="http://exslt.org/common"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="exsl"
version="1.0">
<xsl:variable name="products">
<array>
<item><name>Scooby</name><value>Doo</value></item>
<item><name>snack</name><value>cookies</value></item>
</array>
</xsl:variable>
<xsl:template match="/">
<xsl:for-each select="exsl:node-set($products)/xhtml:array/xhtml:item">
<xsl:value-of select="xhtml:name" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>