1

XML:

<items>
    <transaction>
        <header>
            <col1>H</col1>
            <col2>XXXX</col2>
            <col3>YYY12345</col3>
            <col4/>
            <col5>YYY12345A1234</col5>
        </header>
    </transaction>
    <item>
        <col1>D</col1>
        <col2>1</col2>
        <col3>5358478</col3>
        <col4>-1.0000</col4>
        <col5>CA</col5>
    </item>
    <item>
        <col1>D</col1>
        <col2>2</col2>
        <col3>9477498</col3>
        <col4>1.0000</col4>
        <col5>CA</col5>
    </item>
    <item>
        <col1>D</col1>
        <col2>2</col2>
        <col3>9477498</col3>
        <col4>1.0000</col4>
        <col5>CA</col5>
    </item>
    <transaction>
        <header>
            <col1>H</col1>
            <col2>XXXX</col2>
            <col3>YYY12345</col3>
            <col4/>
            <col5>YYY12345A1236</col5>
        </header>
    </transaction>
    <item>
        <col1>D</col1>
        <col2>1</col2>
        <col3>1676600</col3>
        <col4>1.0000</col4>
        <col5>CA</col5>
    </item>
    <item>
        <col1>D</col1>
        <col2>2</col2>
        <col3>5602891</col3>
        <col4>1.0000</col4>
        <col5>CA</col5>
    </item>
    <item>
        <col1>D</col1>
        <col2>3</col2>
        <col3>7990401</col3>
        <col4>2.0000</col4>
        <col5>CA</col5>
    </item>
    <item>
        <col1>D</col1>
        <col2>4</col2>
        <col3>6985683</col3>
        <col4>1.0000</col4>
        <col5>CA</col5>
    </item>
    <item>
        <col1>D</col1>
        <col2>5</col2>
        <col3>9477498</col3>
        <col4>-1.0000</col4>
        <col5>CA</col5>
    </item>
    <item>
        <col1>D</col1>
        <col2>5</col2>
        <col3>9477498</col3>
        <col4>-1.0000</col4>
        <col5>CA</col5>
    </item>
</items>

望ましい出力:

<items>
    <transaction>
        <header>
            <col1>H</col1>
            <col2>XXXX</col2>
            <col3>YYY12345</col3>
            <col4/>
            <col5>YYY12345A1234</col5>
        </header>
        <item>
            <col1>D</col1>
            <col2>1</col2>
            <col3>5358478</col3>
            <col4>-1.0000</col4>
            <col5>CA</col5>
        </item>
        <item>
            <col1>D</col1>
            <col2>2</col2>
            <col3>9477498</col3>
            <col4>1.0000</col4>
            <col5>CA</col5>
        </item>
        <item>
            <col1>D</col1>
            <col2>2</col2>
            <col3>9477498</col3>
            <col4>1.0000</col4>
            <col5>CA</col5>
        </item>
    </transaction>
    <transaction>
        <header>
            <col1>H</col1>
            <col2>XXXX</col2>
            <col3>YYY12345</col3>
            <col4/>
            <col5>YYY12345A1236</col5>
        </header>
        <item>
            <col1>D</col1>
            <col2>1</col2>
            <col3>1676600</col3>
            <col4>1.0000</col4>
            <col5>CA</col5>
        </item>
        <item>
            <col1>D</col1>
            <col2>2</col2>
            <col3>5602891</col3>
            <col4>1.0000</col4>
            <col5>CA</col5>
        </item>
        <item>
            <col1>D</col1>
            <col2>3</col2>
            <col3>7990401</col3>
            <col4>2.0000</col4>
            <col5>CA</col5>
        </item>
        <item>
            <col1>D</col1>
            <col2>4</col2>
            <col3>6985683</col3>
            <col4>1.0000</col4>
            <col5>CA</col5>
        </item>
        <item>
            <col1>D</col1>
            <col2>5</col2>
            <col3>9477498</col3>
            <col4>-1.0000</col4>
            <col5>CA</col5>
        </item>
        <item>
            <col1>D</col1>
            <col2>5</col2>
            <col3>9477498</col3>
            <col4>-1.0000</col4>
            <col5>CA</col5>
        </item>
    </transaction>
</items>

xslt 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:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
4

1 に答える 1

0

transactionサンプルの入力と出力を再フォーマットし、diff を使用するのに数分費やした後、要素のすべての兄弟を新しい子としてトランザクション要素に移動するだけだと思います。真実?

次のテンプレートをスタイルシートに追加すると、目的の出力を生成するスタイルシートが生成されます。

最初に、そのトランザクションの子に対してのみitemsapply-templates を呼び出すためのテンプレート(出力が output要素の子として表示される唯一のものであるため):items

<xsl:template match="items">
  <items>
    <xsl:apply-templates select="transaction"/>
  </items>
</xsl:template>

transactionテンプレートは、デフォルト モードで、最初にその子に対して apply-templatesを呼び出します。(これは要素を処理します。) 次に、特別なモード (ここでは と呼ばれます) で、headerすぐ右の兄弟 (出力で要素の最初のitem子になります) で apply-templates を呼び出します。transactionitems

<xsl:template match="transaction">
  <transaction>
    <xsl:apply-templates/>
    <xsl:apply-templates 
        mode="items" 
        select="following-sibling::*[1]"/>
  </transaction>
</xsl:template>

このitemsモードは、特定のトランザクションのアイテムを収集することに特化しています。項目がすべて兄弟であり、すべてが逐語的に出力にコピーされ、次のtransaction兄弟が見つかったときに項目のシーケンスが終了するという事実を利用します。

itemそのため、モード内のテンプレートitemsは 2 つのことを行います。最初にそれ自体をコピーし、次に、まだitemsモード内にあるテンプレートをすぐ右の兄弟に適用します。それが別の項目である場合は、このテンプレートを再度評価することになります。そしてまた。等々。(項目が非常に多く、XSLT オプティマイザーが弱い場合、スタック メモリの要件が高くなる可能性があります。)

<xsl:template match="item" mode="items">
  <xsl:copy-of select="."/>
  <xsl:apply-templates 
      mode="items" 
      select="following-sibling::*[1]"/>
</xsl:template>

item最終的に、要素のすぐ右の兄弟が要素になりtransactionます。その時点で、再帰を停止したいので、items-mode テンプレートは何もしtransactionません。(トランザクションのデフォルト モード テンプレートが処理するため、トランザクションを処理する必要はありません。)

<xsl:template match="transaction" mode="items"/>

right-sibling-recursion パターンは学ぶ価値があります。このようなグループ化タスクが簡単になります。

于 2012-10-17T02:10:38.560 に答える