基于中间XSLT结果的生成问题

时间:2011-02-07 17:44:22

标签: xml xslt

通常,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。

提前致谢。

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“数据类型”。