xslt 1.0节点集未循环

时间:2018-10-05 14:59:12

标签: xslt xslt-1.0 exslt

我有一个ggplot(data=tdat, aes(x=time,y=value)) + geom_bar(stat="identity")+ facet_grid(rows = vars(variable), cols = vars(B), labeller = plot_labeller, scales="free_y", switch = 'y') ,其中包含节点列表。当我尝试使用for-each遍历它们时,没有任何结果。我正在使用saxon655和Java 1.8.0_181。

这是xslt:

xsl:variable

xml:

  <?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 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的值。

1 个答案:

答案 0 :(得分:2)

执行exsl:node-set($products)返回一个文档节点,该节点在变量中包含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>