对XSLT1中生成的元素进行计数

  • 本文关键字:元素 XSLT1 xslt xslt-1.0
  • 更新时间 :
  • 英文 :


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

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

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

这能做到吗?

谢谢。

如果您提供一些XSLT的摘录,将会有很大帮助。没有它,我无法提供XSLT代码。我将试着给答案一些"方法":

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

下面是如何做到这一点的演示:

<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(结果树片段)类型,并且需要转换为常规树,以便可以访问该树中的任何节点(在RTF上仍然允许xsl:copy-ofstring())。

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

有关多通道处理的更多信息,请参阅:两阶段处理:不从第一阶段XSLT 2.0处理中输出空标记

相关内容

  • 没有找到相关文章

最新更新