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") 中定义了默认名称空间声明。这意味着变量中的元素没有前缀,将位于该命名空间中。

因此,除非您有理由在命名空间中包含 arrayitem,否则请像这样声明变量

<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>

或者,如果您需要在命名空间中使用 arrayitem,您可以这样处理它们:

<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>