通常,XSLT应该处理原始XML文件并提供样式表。
但目前我的任务是,我最后一个XML文件中的最后一个节点应该是一个数字,用于计算我的RESULTING xml文件中的某些类型的节点(不是原始节点)。
例如,我的初始XML是空的,在我的样式表中,我从其他一些地方抓取数据并将它们插入到这个空的XML中,以创建如下的某些节点:
<Plant>
<Flower>
<Flower1>..</Flower1>
<Flower2>..</Flower2>
</Flower>
<Tree>
<Tree1>...</Tree1>
<Tree2>...</Tree2>
</Tree>
....
<Counter>? </Counter>
</Plant>
我的问题是这个Counter节点,它应该是一个数字,表示转换后创建了多少个Plant子节点。所以我假设一个两步过程可能是有效的:第一步是做一个中间XSLT,它抓取所有“Plant”数据并填入空的初始XML文件;然后第二步是对此XML文件进行简单的XPath计数,并附加另一个节点“Counter”以包含此数字。但我不确定如何将这两个XSLT链接到单个XSLT中(因为需要一键转换),比如如何表示中间XML文件以及如何命令IDE(在我的情况下是XMLSpy)来做进一步的XSLT。
提前致谢。
答案 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“数据类型”。