我的XML中有多个Row元素数据,像这样-
<ROW TYPE="SPECIFICATION" ID="1">
<R1>English1</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="1">
<R1>Maths1</R1>
</ROW>
<ROW TYPE="TOTAL" ID="1">
<R1>Code1</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="2">
<R1>English2</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="2">
<R1>Maths2</R1>
</ROW>
<ROW TYPE="TOTAL" ID="2">
<R1>Code2</R1>
</ROW>
<ROW TYPE="MAIN" ID="3">
<R1>Code3</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="4">
<R1>English4</R1>
</ROW>
<ROW TYPE="TOTAL" ID="4">
<R1>Code4</R1>
</ROW>
我希望我的输出显示在图像中,这样行数据在for-each循环中工作。要求首先显示ROW TYPE="TOTAL" ID="1",然后显示ROW TYPE="SPECIFICATION"数据。再次在循环中进一步移动,应该首先显示ROW TYPE="TOTAL" ID="2",然后显示它的ROW TYPE="SPECIFICATION"数据。如果ROW_TYPE不同(可以是任何值),那么它应该按顺序出现。它只针对规格和TOTAL。
基本上应该是这样的-
Code1
English1
Maths1
Code2
English2
Maths2
Code3
Code4
English4
xslt代码适用于序列,就像for-each循环适用于序列一样。但是我需要首先为那个ID移动TOTAL行。
这一转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kRowById"
match="ROW[not(@TYPE='TOTAL' or @TYPE='MAIN')]"
use="@ID"/>
<xsl:template match="ROW[@TYPE='TOTAL' or @TYPE='MAIN']">
<xsl:copy-of select="."/>
<xsl:copy-of select="key('kRowById', @ID)"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
当应用于XML文档(由提供的XML片段生成,通过将其包装到单个top元素中)时:
<t>
<ROW TYPE="SPECIFICATION" ID="1">
<R1>English1</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="1">
<R1>Maths1</R1>
</ROW>
<ROW TYPE="TOTAL" ID="1">
<R1>Code1</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="2">
<R1>English2</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="2">
<R1>Maths2</R1>
</ROW>
<ROW TYPE="TOTAL" ID="2">
<R1>Code2</R1>
</ROW>
<ROW TYPE="MAIN" ID="3">
<R1>Code3</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="4">
<R1>English4</R1>
</ROW>
<ROW TYPE="TOTAL" ID="4">
<R1>Code4</R1>
</ROW>
</t>
生成所需的正确结果:
<ROW TYPE="TOTAL" ID="1">
<R1>Code1</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="1">
<R1>English1</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="1">
<R1>Maths1</R1>
</ROW>
<ROW TYPE="TOTAL" ID="2">
<R1>Code2</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="2">
<R1>English2</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="2">
<R1>Maths2</R1>
</ROW>
<ROW TYPE="MAIN" ID="3">
<R1>Code3</R1>
</ROW>
<ROW TYPE="TOTAL" ID="4">
<R1>Code4</R1>
</ROW>
<ROW TYPE="SPECIFICATION" ID="4">
<R1>English4</R1>
</ROW>
:
根据OP在注释中的要求,如果任何与"SPECIFICATION"不同的值必须放在组的头部,则使用此代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kRowById"
match="ROW[not(@TYPE='TOTAL' or @TYPE='MAIN')]"
use="@ID"/>
<xsl:template match="ROW[not(@TYPE='SPECIFICATION')]">
<xsl:copy-of select="."/>
<xsl:copy-of select="key('kRowById', @ID)"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>