计算在XSLT1中生成的元素

时间:2013-03-20 15:10:03

标签: xslt xslt-1.0

我正在尝试计算我的转换生成的元素(必须使用XLST1)。例如,我的转换创建:

<Parent>
  <ElementX Att1="2"/>
  <ElementY Att1="1"/>
  <ElementZ Att1="6"/>
</Parent>

我需要在相同转换中打印3,因为有3个子元素。

可以这样做吗?

感谢。

2 个答案:

答案 0 :(得分:0)

如果您提供XSLT的一些摘录,那将会有很大帮助。 没有它我不会给你一个XSLT代码。我会试着给出答案的一些“方法”:

一种解决方案可能是将输出存储到节点集中(使用提供nodeset()函数的XSLT 1.0扩展)并对此变量应用XPath count()函数。之后只需用xsl:value-of输出你的变量,你的计数结果也是一样的。

答案 1 :(得分:0)

以下是演示如何执行此操作

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:variable name="vrtfPass1">
    <xsl:apply-templates/>
  </xsl:variable>

  <xsl:value-of select="count(ext:node-set($vrtfPass1)/*/*)"/>
 </xsl:template>

 <xsl:template match="/*">
    <Parent>
      <ElementX Att1="2"/>
      <ElementY Att1="1"/>
      <ElementZ Att1="6"/>
    </Parent>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于任何XML文档(未在此演示中使用)时,会生成所需的正确结果:

3

<强>解释

处理转换结果(在单个转换中)的一般方法是在两遍中组织 ,其中我们将第一遍的结果保存在变量中。

在第二遍中,我们访问结果并进行额外处理。

请注意,在XSLT 1.0中,如果捕获第一遍结果的变量属于臭名昭着的RTF(结果树片段)类型,并且需要按照此树中任何节点的顺序转换为常规树可访问(xsl:copy-ofstring()仍然允许在RTF上播放。

这种到常规树的转换是通过扩展函数完成的,扩展函数通常具有名称node-set,并且始终属于供应商定义的命名空间。在本演示中,我们使用属于EXSLT命名空间的node-set()扩展函数 - 因为大多数XSLT 1.0处理器都实现了EXSLT。

有关多次传递处理的详细信息,请参阅Two phase processing: Do not output empty tags from phase-1 XSLT 2.0 processing

相关问题