我有多个行数据在我的XML像这样-
<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>
我希望我的输出显示在图像中,这样行数据在for-each循环中工作。要求首先显示ROW TYPE="TOTAL" ID="1",然后显示ROW TYPE="SPECIFICATION"数据。再次移动到循环中,ROW TYPE="TOTAL" ID="2"应该首先显示,然后是它的ROW TYPE="SPECIFICATION"数据。
基本上应该是这样的-
Code1
English1
Maths1
Code2
English2
Maths2
XSLT代码与for-2each循环一样适用于序列。但是我需要首先为那个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')]" use="@ID"/>
<xsl:template match="ROW[@TYPE='TOTAL']">
<xsl:copy-of select="."/>
<xsl:copy-of select="key('kRowById', @ID)"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
当应用于所提供的XML(包装成单个top元素以形成格式良好的XML文档)时:
<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>
</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>