2013-06-18 19 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設計,你可以永遠不要爲此寫一個模式。