如何在XSLT中计算节点?

时间:2011-01-31 19:08:36

标签: xml xslt

我现在来到了我的XSL样式表的最后一步,它需要输出一个代表添加的节点总数的数字。实际上,对我来说似乎并不那么简单:

首先,我不计算原始xml文档中的节点,我将从生成的XML中计算某些节点(初始xml文档可能为空)。

其次,我没有计算所有节点。

例如,这是我的一段XSLT代码:

<xsl:template name="Loop2000A">
  <Loop2000A>
<HL>
  <HL01>
    <xsl:value-of select="'1'"/>
  </HL01>
  <HL03>
    <xsl:value-of select="'20'"/>
  </HL03>
</HL>
 <xsl:if test="$recbat//provider_taxonomy_qual !='' ">
<PRV>
 <PRV01>
   <xsl:value-of select="'BI'"/>
 </PRV01>
     <PRV02>
   <xsl:value-of select="$recbat//provider_taxonomy_qual"/>
 </PRV02>
<PRV03>
   <xsl:value-of select="$recbat//provider_taxonomy"/>
</PRV03>
   </PRV>
  </xsl:if>
<xsl:call-template name="Loop2010AA"/>

因此,对于此代码,称为段,并且那些$ recbat等是数据源。所以我希望我真的想要计算这些段的数量,它可以跨越不同的模板(如上面的“Loop2010AA”模板,这是另一个模板),并且这些段可能有循环,因此它们可以连续创建3次,我们的计数器应该相应地增加3,或者“if”语句失败,因此没有创建这样的段,那么计数器应该保持不变。

我不确定实现这一点的正确方法,因为我用Google搜索的大部分教程都是关于计算原始XML文档中的节点。我现在的一个想法是使用参数传递,但我不知道如何使这个参数成为全局参数?

或者,我正在考虑采用更直接的方式。而不是使用计数器变量,有没有办法可以先生成输出xml文档,然后计算我想要的节点,然后生成带有数字的TRUE输出。

1 个答案:

答案 0 :(得分:3)

以下是处理转换结果的一般方法,包括计算其节点

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 >
 <xsl:output method="text"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

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

  <xsl:variable name="vPass2" select="ext:node-set($vrtfPass1)"/>

  <xsl:value-of select="count($vPass2/*/*/*)"/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档

<nums>
 <num>1</num>
 <num>2</num>
 <num>3</num>
 <num>4</num>
 <num>5</num>
</nums>

产生了正确的结果

10

在XSLT 1.0(仅限)中,在多次传递处理中通常需要使用xxx:node-set()扩展函数。在XSLT 2.0中没有这样的要求,它消除了臭名昭着的RTF“数据类型”。