我的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>
我希望我的输出显示在Image中,就像这个ROW数据在for-each循环中工作一样。并且要求首先应显示ROW TYPE =“TOTAL”ID =“1”,然后显示其ROW TYPE =“SPECIFICATION”数据。再次循环移动,首先应显示ROW TYPE =“TOTAL”ID =“2”,然后显示其ROW TYPE =“SPECIFICATION”数据。如果ROW_TYPE不同(可以是任何东西)那么它应该按顺序出现。它仅适用于SPECIFICATION和TOTAL。
基本上它应该是这样的 -
Code1
English1
Maths1
Code2
English2
Maths2
Code3
Code4
English4
xslt代码适用于序列,因为每个循环都有效。但是我需要先为该ID移动TOTAL行。请为此建议逻辑。
答案 0 :(得分:0)
此转化:
<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片段生成,通过将其包装到单个顶部元素中):
<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>