Xslt 计算<;返回的元素数;呼叫模板>;

Xslt 计算<;返回的元素数;呼叫模板>;,xslt,count,Xslt,Count,我有以下xsl样式表: <xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="utf-8"/> <xsl:template match="/"> <xsl:variable name="elements">

我有以下xsl样式表:

<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="utf-8"/>

  <xsl:template match="/">
    <xsl:variable name="elements">
      <xsl:call-template name="get-some-nodes"/>
    </xsl:variable>

    <root>
      <values>
        <xsl:copy-of select="$elements"/>
      </values>
      <count>
        <xsl:value-of select="count($elements)"/>
      </count>
    </root>
  </xsl:template>

  <xsl:template name="get-some-nodes">
    <node>1</node>
    <node>2</node>
    <node>3</node>
  </xsl:template>

</xsl:stylesheet>

1.
2.
3.
(应用于什么样的xml并不重要,它会生成自己的数据)

这样做(使用xsltproc)的结果是:


1.
2.
3.
1.
假设调用的模板返回三个节点,我希望“count($elements)”是3,但它是一个。我怀疑结果可能被包装在某种根节点中,但任何尝试计数($elements/*)或类似操作都失败了,我相信,因为$elements是一个结果树片段,而不是一个节点集

我没有访问exslt或xslt2.0的任何优点,肯定有办法获得存储在变量中的节点数

我也很乐意在不使用中间变量的情况下计算调用模板返回的节点数,但我看不出这是怎么可能的

以下是一些名称空间,通常将
xxx:
绑定到它们:

"http://exslt.org/common/"

"urn:schemas-microsoft-com:xslt"
count($elements/*)
在XSLT 2.0中,RTF“类型”不再存在,您只需拥有

"http://exslt.org/common/"

"urn:schemas-microsoft-com:xslt"
count($elements/*)
如果未指定
$elements
的类型(默认值为
document-node()


如果
$elements
的类型指定为
element()*

好问题,+1。有关详细的解释和解决方案,请参见我的答案。答案不错,但我认为我没有可用的节点集函数。我最终计划将其部署为confluence(atlassian的wiki产品)页面,经过实验后,它似乎不支持这两种扩展。遗憾的是,我正在寻找一个普通的XSLT 1解决方案。@gfxmonk:很可能您的XSLT处理器有一个
xxx:node-set()
函数——大多数XSLT处理器都有。您使用的XSLT处理器是什么?如果您不知道,可以从这个函数中获得结果:
system-property(xsl:vendor)
system-property(xsl:vendor-url)
。啊,这是一个很好的技巧。我正在使用ApacheXalan-j。但是,我打算在多个xslt处理器(xalan和libxslt)上运行它,因此我仍然非常喜欢不使用此类扩展的解决方案。另外,在尝试使用xalan节点集函数后,它实际上不起作用(并且没有给我任何输出或错误)。我想confluence可能在某种受限环境中运行此功能?@gfxmonk:对于Xalan,名称空间是:
http://xml.apache.org/xalan“
因此,将以下名称空间添加到您的
中:
xmlns:vendor=”http://xml.apache.org/xalan“
然后尝试
供应商:节点集()
。请注意,此扩展函数的名称中没有连字符。
count($elements/*)
count($elements)