-1

我的 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 代码适用于序列,就像 for-each 循环一样。但我需要先为该 ID 移动 TOTAL 行。请为此提出逻辑。

4

1 回答 1

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>
于 2013-03-22T05:06:58.230 回答