-1

次のように、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>
<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>

この ROW データが for-each ループで機能するように、出力を Image に表示したいと考えています。そして要件は、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

for-each ループが機能するように、xslt コードはシーケンスに対して機能します。しかし、その 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 に答える