2013-06-18 8 views
-1

샘플 입력 XML은 다음과 같습니다. code 요소 값을 기반으로 요소를 그룹화하는 동안 llNo 요소를 순차적으로 생성해야합니까?순차적 라인 번호를 생성하십시오. 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

난 당신이 정말 AccountsX 요소를 만들려면 당신이 for-each-group<xsl:element name="Accounts{position()}">...</xsl:element>을 사용할 수 있습니다 생각에 있어야합니다. llNo 요소를 사용하여 category 요소에 번호를 매기려면 먼저 변수로 그룹화해야한다고 생각하고 <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> 
    <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> 

상기 입력

<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> 

에게 변환 Accounts1, Accounts2과 같은 XML 디자인이 좋지 않을 수도 있습니다. 그것을위한 스키마를 작성하지 마십시오.