2012-09-10 62 views
0

输入:XML的分组节点XSLT 1.0

输入XML

<Root> 
    <Number>1</Number> 
    <Reference>100</Reference> 

    <Number>2</Number> 
    <Reference>101</Reference> 

    <Number>3</Number> 
    <Reference>100</Reference> 

    <Number>4</Number> 
    <Reference>102</Reference> 

    <Number>5</Number> 
    <Reference>100</Reference> 
</Root> 

预期输出:

<Root> 
    <Number>1</Number> 
    <Reference>100</Reference> 
    <RefNumber>1</RefNumber> 

    <Number>2</Number> 
    <Reference>101</Reference> 
    <RefNumber>1</RefNumber> 

    <Number>3</Number> 
    <Reference>100</Reference> 
    <RefNumber>2</RefNumber> 

    <Number>4</Number> 
    <Reference>102</Reference> 
    <RefNumber>1</RefNumber> 

    <Number>5</Number> 
    <Reference>100</Reference> 
    <RefNumber>3</RefNumber> 
</Root> 

如何分组基于根/参考做,并添加序列号,RefNumber在xslt 1.0中输出?

由于提前做这个

+0

嗨..它是分组的序列号,比如参考= 100它是1,2,3 [即100的出现次数] –

回答

3

的方法之一是使用XSL :数。每当你匹配参考元素,复制元素,并与参考元素具有相同值的数量增加RefNumber元素:

<xsl:template match="Reference"> 
    <xsl:copy-of select="." /> 
    <xsl:variable name="Ref" select="." /> 
    <RefNumber><xsl:number count="Reference[. = $Ref]" /></RefNumber> 
</xsl:template> 

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="Reference"> 
     <xsl:copy-of select="." /> 
     <xsl:variable name="Ref" select="." /> 
     <RefNumber><xsl:number count="Reference[. = $Ref]" /></RefNumber> 
    </xsl:template> 

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

当应用于您的示例XML时,将输出以下内容:

<Root> 
    <Number>1</Number> 
    <Reference>100</Reference> 
    <RefNumber>1</RefNumber> 

    <Number>2</Number> 
    <Reference>101</Reference> 
    <RefNumber>1</RefNumber> 

    <Number>3</Number> 
    <Reference>100</Reference> 
    <RefNumber>2</RefNumber> 

    <Number>4</Number> 
    <Reference>102</Reference> 
    <RefNumber>1</RefNumber> 

    <Number>5</Number> 
    <Reference>100</Reference> 
    <RefNumber>3</RefNumber> 
</Root> 

请注意使用身份转换模板来复制其他现有节点。

+0

非常感谢:) –