xslt循环重复出现的元素

时间:2014-07-03 19:38:19

标签: xml xslt

我有一组元素,需要将它们分成单独的集合。

输入是:

Records

A
B
C
D
D
D
C
C
D

A
B
C
D
D
D
D

A
B
C
C
C
C
D

/Records

我想将它们分成如下部分:

Records 

Record
A
B 
C
C 
C  
D 
D 
D 
D
/Record

Record
A
B
C
D
D
D
/Record

/Records

我已经尝试了一些东西,并且能够使其只有一个C和D不重复,如上所示。

请帮忙。

以下是我的XSLT:

<ns1:RoutingRecords>
     <xsl:for-each select="/imp1:RoutingRecords/imp1:A">
        <xsl:variable name="level1Count" select="position()"/>
        <ns1:RoutingRecord>
           <ns1:A>
              <ns1:Item_Number>
                 <xsl:value-of select="/imp1:RoutingRecords/imp1:A[$level1Count]/imp1:C1"/>
              </ns1:Item_Number>
           </ns1:A>
           <ns1:B>
              <ns1:End_Stckrm>
                 <xsl:value-of select="/imp1:RoutingRecords/imp1:B[$level1Count]/imp1:C1"/>
              </ns1:End_Stckrm>
           </ns1:B>
           <xsl:for-each select="$level1Count+1">
              <ns1:F>
                 <ns1:Op_Sequence>
                    <xsl:value-of select="."/>
                 </ns1:Op_Sequence>
              </ns1:F>
           </xsl:for-each>
        </ns1:RoutingRecord>
     </xsl:for-each>
  </ns1:RoutingRecords>
抱歉没说清楚。 我的输入每个A B C D记录都有子元素

<Records> <A><C1>NLO84B514948AJP1 0 1 STIFFENER SHEET 001 7LNEC0</C1></A> <B><C1>7-ST 7-B77B052214052214 $</C1></B> <C><C1>001 000100010050000</C1></C> <D><C1>P1 LABOR IN G1</C1></D>

1 个答案:

答案 0 :(得分:0)

使用xsl:for-each-group XSLT 2.0非常容易。

XML输入(为元素添加值以帮助显示正确的分组。)

<Records>

    <A>
        <C1>NLO84B514948AJP1 0 1 STIFFENER SHEET 001 7LNEC0</C1>
    </A>
    <B>
        <C1>7-ST 7-B77B052214052214 $</C1>
    </B>
    <C>
        <C1>001 000100010050000</C1>
    </C>
    <D>
        <C1>P1 LABOR IN G1</C1>
    </D>

    <A>g1</A>
    <B>g1</B>
    <C>g1</C>
    <D>g1</D>
    <D>g1</D>
    <D>g1</D>
    <C>g1</C>
    <C>g1</C>
    <D>g1</D>

    <A>g2</A>
    <B>g2</B>
    <C>g2</C>
    <D>g2</D>
    <D>g2</D>
    <D>g2</D>
    <D>g2</D>

    <A>g3</A>
    <B>g3</B>
    <C>g3</C>
    <C>g3</C>
    <C>g3</C>
    <C>g3</C>
    <D>g3</D>

</Records>

XSLT 2.0

<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="/*">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:for-each-group select="*" group-starting-with="A">
                <Record>
                    <xsl:copy-of select="current-group()"/>                    
                </Record>
            </xsl:for-each-group>
        </xsl:copy>        
    </xsl:template>

</xsl:stylesheet>

<强>输出

<Records>
   <Record>
      <A>
         <C1>NLO84B514948AJP1 0 1 STIFFENER SHEET 001 7LNEC0</C1>
      </A>
      <B>
         <C1>7-ST 7-B77B052214052214 $</C1>
      </B>
      <C>
         <C1>001 000100010050000</C1>
      </C>
      <D>
         <C1>P1 LABOR IN G1</C1>
      </D>
   </Record>
   <Record>
      <A>g1</A>
      <B>g1</B>
      <C>g1</C>
      <D>g1</D>
      <D>g1</D>
      <D>g1</D>
      <C>g1</C>
      <C>g1</C>
      <D>g1</D>
   </Record>
   <Record>
      <A>g2</A>
      <B>g2</B>
      <C>g2</C>
      <D>g2</D>
      <D>g2</D>
      <D>g2</D>
      <D>g2</D>
   </Record>
   <Record>
      <A>g3</A>
      <B>g3</B>
      <C>g3</C>
      <C>g3</C>
      <C>g3</C>
      <C>g3</C>
      <D>g3</D>
   </Record>
</Records>

这是一个XSLT 1.0版本,使用上面相同的输入产生与上面相同的输出。

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*">
        <xsl:copy>
            <xsl:apply-templates select="@*|A"/>
        </xsl:copy>        
    </xsl:template>

    <xsl:template match="A">
        <Record>
            <xsl:copy-of select=".|following-sibling::*[not(self::A) and generate-id(preceding-sibling::A[1])=generate-id(current())]"/>
        </Record>
    </xsl:template>

</xsl:stylesheet>