我现在来到了我的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输出。
答案 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“数据类型”。