2011-02-07 20 views
2

通常事情的问题时,应XSLT上的原始XML文件工作,并设有一个样式表。关于如何生成基于中间XSLT结果

但目前我的任务,我在我最后的XML文件中最后一个节点应该是一个数字,算在我的生成的XML文件中的某些类型的节点(不是原单)。

因此,例如,我最初的XML是空的,而在我的样式表,我已经从其他一些地方抓住数据并插入他们进入这个空XML创建某些节点是这样的:

<Plant> 
<Flower> 
    <Flower1>..</Flower1> 
    <Flower2>..</Flower2> 
</Flower> 

<Tree> 
    <Tree1>...</Tree1> 
    <Tree2>...</Tree2> 
</Tree> 

    .... 

<Counter>? </Counter> 
</Plant> 

我的问题是这个Counter节点,它应该是一个数字,表示在转换后创建了多少个Plant的子节点。因此,我将假定一个两步骤过程可能是有效的:第一步是做,抓住所有的“植物”的数据和填充在空的初始XML文件中的中间XSLT;然后第二步是对这个XML文件进行一个简单的XPath计数,并附加另一个节点“Counter”来包含这个数字。但我不完全知道如何做连锁这两个XSLT文件到一个单一的XSLT(因为一点击需要变换),怎么样来代表中间XML文件和如何指挥IDE(XMLSpy的在我的情况)做另一个XSLT。

在此先感谢。

+0

问得好,+1。查看我的答案,了解多遍转换的完整示例。 :) – 2011-02-07 18:05:44

回答

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

+0

+1正确的答案。 – 2011-02-07 18:16:57