我有一组元素,需要将它们分成单独的集合。
输入是:
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>
答案 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>