2013-06-18 20 views
-1

我的示例输入XML如下所示。我需要依次生成llNo元素,并根据元素值code对元素进行分组?生成序列号。或在XSLT 2.0中计数器

<voucher> 
<ID>1234</ID> 
<Type>Voucher</Type> 
<Flag>true</Flag> 
<Accounts> 
    <AccId>89</AccId> 
    <AccCd1>a11</AccCd1>   
    <category> 
     <catId>ct11</catId> 
     <code>IB</code> 
     <Details>abcd</Details>   
    </category> 
    <category> 
     <catId>ct12</catId> 
     <code>IB</code> 
     <Details>cvbn</Details>   
    </category> 
    <category> 
     <catId>ct13</catId> 
     <code>CB</code> 
     <Details>asdfg</Details>    
    </category> 
    <category> 
     <catId>ct14</catId> 
     <code>TV</code> 
     <Details>asdfg</Details>    
    </category> 
</Accounts> 
<Accounts> 
    <AccId>89</AccId> 
    <AccCd1>a11</AccCd1>   
    <category> 
     <catId>ct15</catId> 
     <code>IB</code> 
     <Details>abcd</Details>   
    </category> 
    <category> 
     <catId>ct16</catId> 
     <code>CB</code> 
     <Details>cvbn</Details>   
    </category> 
    <category> 
     <catId>ct17</catId> 
     <code>CB</code> 
     <Details>asdfg</Details>    
    </category> 
    <category> 
     <catId>ct18</catId> 
     <code>TV</code> 
     <Details>asdfg</Details> 

    </category> 
</Accounts> 
</voucher> 

输出XML应在以下格式

<Voucher> 
<ID>1234</ID> 
<Type>Voucher</Type> 
<Flag>true</Flag> 
<Accounts1> 
    <AccId>89</AccId> 
    <AccCd1>a11</AccCd1>  
    <category> 
     <llNo>1</llNo> 
     <catId>ct11</catId> 
     <code>IB</code> 
     <Details>abcd</Details>   
    </category> 
    <category> 
     <llNo>2</llNo> 
     <catId>ct12</catId> 
     <code>IB</code> 
     <Details>cvbn</Details>   
    </category> 
    <category> 
     <llNo>3</llNo> 
     <catId>ct15</catId> 
     <code>IB</code> 
     <Details>abcd</Details>   
    </category> 
</Accounts1> 
<Accounts2> 
    <AccId>89</AccId> 
    <AccCd1>a11</AccCd1> 
    <category> 
     <llNo>4</llNo> 
     <catId>ct13</catId> 
     <code>CB</code> 
     <Details>asdfg</Details>    
    </category> 
    <category> 
     <llNo>5</llNo> 
     <catId>ct17</catId> 
     <code>CB</code> 
     <Details>asdfg</Details>    
    </category> 
<Accounts2> 
<Accounts3> 
    <AccId>89</AccId> 
    <AccCd1>a11</AccCd1> 
    <category> 
     <llNo>6</llNo> 
     <catId>ct14</catId> 
     <code>TV</code> 
     <Details>asdfg</Details>    
    </category> 
    <category> 
     <llNo>7</llNo> 
     <catId>ct18</catId> 
     <code>TV</code> 
     <Details>asdfg</Details> 

    </category> 
<Accounts3> 
</Voucher> 
+1

你有什么尝试,你卡在哪里?使用XSLT 2.0 for each-group和position()很容易。 –

回答

0

我认为你可以使用for-each-group<xsl:element name="Accounts{position()}">...</xsl:element>如果你真的想创建AccountsX元素。要按顺序编号category元素与llNo元素,我认为您首先需要将其分组为一个变量,然后您可以使用<xsl:number level="any"/>

所以这种做法样式表是

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="voucher"> 
    <Voucher> 
    <xsl:apply-templates select="* except Accounts"/> 
    <xsl:variable name="groups"> 
     <xsl:for-each-group select="Accounts/category" group-by="code"> 
     <xsl:element name="Accounts{position()}"> 
      <xsl:copy-of select="../(AccId, AccCd1), current-group()"/> 
     </xsl:element> 
     </xsl:for-each-group> 
    </xsl:variable> 
    <xsl:apply-templates select="$groups/*"/> 
    </Voucher> 
</xsl:template> 

<xsl:template match="category"> 
    <xsl:copy> 
    <llNo><xsl:number level="any"/></llNo> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

和将输入

<voucher> 
<ID>1234</ID> 
<Type>Voucher</Type> 
<Flag>true</Flag> 
<Accounts> 
    <AccId>89</AccId> 
    <AccCd1>a11</AccCd1>   
    <category> 
     <catId>ct11</catId> 
     <code>IB</code> 
     <Details>abcd</Details>   
    </category> 
    <category> 
     <catId>ct12</catId> 
     <code>IB</code> 
     <Details>cvbn</Details>   
    </category> 
    <category> 
     <catId>ct13</catId> 
     <code>CB</code> 
     <Details>asdfg</Details>    
    </category> 
    <category> 
     <catId>ct14</catId> 
     <code>TV</code> 
     <Details>asdfg</Details>    
    </category> 
</Accounts> 
<Accounts> 
    <AccId>89</AccId> 
    <AccCd1>a11</AccCd1>   
    <category> 
     <catId>ct15</catId> 
     <code>IB</code> 
     <Details>abcd</Details>   
    </category> 
    <category> 
     <catId>ct16</catId> 
     <code>CB</code> 
     <Details>cvbn</Details>   
    </category> 
    <category> 
     <catId>ct17</catId> 
     <code>CB</code> 
     <Details>asdfg</Details>    
    </category> 
    <category> 
     <catId>ct18</catId> 
     <code>TV</code> 
     <Details>asdfg</Details> 

    </category> 
</Accounts> 
</voucher> 

到结果

<Voucher> 
    <ID>1234</ID> 
    <Type>Voucher</Type> 
    <Flag>true</Flag> 
    <Accounts1> 
     <AccId>89</AccId> 
     <AccCd1>a11</AccCd1> 
     <category> 
     <llNo>1</llNo> 
     <catId>ct11</catId> 
     <code>IB</code> 
     <Details>abcd</Details> 
     </category> 
     <category> 
     <llNo>2</llNo> 
     <catId>ct12</catId> 
     <code>IB</code> 
     <Details>cvbn</Details> 
     </category> 
     <category> 
     <llNo>3</llNo> 
     <catId>ct15</catId> 
     <code>IB</code> 
     <Details>abcd</Details> 
     </category> 
    </Accounts1> 
    <Accounts2> 
     <AccId>89</AccId> 
     <AccCd1>a11</AccCd1> 
     <category> 
     <llNo>4</llNo> 
     <catId>ct13</catId> 
     <code>CB</code> 
     <Details>asdfg</Details> 
     </category> 
     <category> 
     <llNo>5</llNo> 
     <catId>ct16</catId> 
     <code>CB</code> 
     <Details>cvbn</Details> 
     </category> 
     <category> 
     <llNo>6</llNo> 
     <catId>ct17</catId> 
     <code>CB</code> 
     <Details>asdfg</Details> 
     </category> 
    </Accounts2> 
    <Accounts3> 
     <AccId>89</AccId> 
     <AccCd1>a11</AccCd1> 
     <category> 
     <llNo>7</llNo> 
     <catId>ct14</catId> 
     <code>TV</code> 
     <Details>asdfg</Details> 
     </category> 
     <category> 
     <llNo>8</llNo> 
     <catId>ct18</catId> 
     <code>TV</code> 
     <Details>asdfg</Details> 
     </category> 
    </Accounts3> 
</Voucher> 

在另一方面把一个索引号到的元素名称像Accounts1,Accounts2是糟糕的XML设计,你可以永远不要为此写一个模式。