xslt 1.0 节点集不循环
xslt 1.0 node-set not looping
我有一个包含节点列表的 xsl:variable
。当我尝试用 for-each 遍历它们时,我没有得到任何结果。我正在使用 saxon655 和 java 1.8.0_181.
这是 xslt:
<?xml version="1.0"?>
<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">
<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)">
<xsl:message>LOOP</xsl:message>
<xsl:value-of select=".//name" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
xml:
<?xml version='1.0' encoding='UTF-8'?>
<book>
text
</book>
最后,我的命令:
/usr/bin/java -cp /usr/local/share/saxon/saxon.jar com.icl.saxon.StyleSheet test.xml test_run.xsl
当我 运行 命令时,我收到一行输出 LOOP
。
我希望为变量数组中的每个项目获取一次消息和 name
的值。
做 exsl:node-set($products)
returns 单个文档节点,其中包含变量中 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>
我有一个包含节点列表的 xsl:variable
。当我尝试用 for-each 遍历它们时,我没有得到任何结果。我正在使用 saxon655 和 java 1.8.0_181.
这是 xslt:
<?xml version="1.0"?>
<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">
<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)">
<xsl:message>LOOP</xsl:message>
<xsl:value-of select=".//name" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
xml:
<?xml version='1.0' encoding='UTF-8'?>
<book>
text
</book>
最后,我的命令:
/usr/bin/java -cp /usr/local/share/saxon/saxon.jar com.icl.saxon.StyleSheet test.xml test_run.xsl
当我 运行 命令时,我收到一行输出 LOOP
。
我希望为变量数组中的每个项目获取一次消息和 name
的值。
做 exsl:node-set($products)
returns 单个文档节点,其中包含变量中 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>