-1

我的示例输入 XML 如下所示。我需要llNo在根据code元素值对元素进行分组的同时按顺序生成一个元素吗?

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

1 回答 1

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>

另一方面,将索引号放入元素名称Accounts1Accounts2是糟糕的 XML 设计,您永远无法为此编写模式。

于 2013-06-19T09:53:58.003 回答