2

XSLT で解決しようとしている問題がありますが、解決策が見つかりません。以下の例は、アイテムをバスケットに追加してから削除する支払いシステムに関連しています。out XML は、バスケットで実行されたアクションの監査証跡を提供します。

シナリオ:

アイテムを追加 (ID 1)

アイテムを追加 (Id 1) 価格変更あり

ボイドアイテム (ID 1)

Void Item (Id 1) 価格変更あり

アイテムを追加 (ID 1)

アイテムを追加 (ID 1)

期待される結果

削除する:

アイテムを追加 (ID 1)

アイテムを追加 (Id 1) 価格変更あり

出力 XML の内容

ボイドアイテム (ID 1)

Void Item (Id 1) 価格変更あり

アイテムを追加 (ID 1)

アイテムを追加 (ID 1)

入力 XML:

<xml>
    <product void="false">
        <sequence_number>1</sequence_number>
        <item_id>11111111</item_id>
        <price>12</price>
    </product>
    <product void="false">
        <sequence_number>2</sequence_number>
        <item_id>11111111</item_id>
        <price>12</price>
        <price_change>
            <price>10</price>
        </price_change>
    </product>
    <product void="true">
        <sequence_number>3</sequence_number>
        <item_id>11111111</item_id>
        <price>12</price>
        <price_change>
            <price>10</price>
        </price_change>
    </product>
    <product void="true">
        <sequence_number>4</sequence_number>
        <item_id>11111111</item_id>
        <price>12</price>
    </product>
    <product void="false">
        <sequence_number>5</sequence_number>
        <item_id>11111111</item_id>
        <price>12</price>
    </product>
    <product void="false">
        <sequence_number>6</sequence_number>
        <item_id>11111111</item_id>
        <price>12</price>
    </product>
</xml>

期待される結果:

<xml>
    <product void="true">
        <sequence_number>3</sequence_number>
        <item_id>11111111</item_id>
        <price>12</price>
        <price_change>
            <price>10</price>
        </price_change>
    </product>
    <product void="true">
        <sequence_number>4</sequence_number>
        <item_id>11111111</item_id>
        <price>12</price>
    </product>
    <product void="false">
        <sequence_number>5</sequence_number>
        <item_id>11111111</item_id>
        <price>12</price>
    </product>
    <product void="false">
        <sequence_number>6</sequence_number>
        <item_id>11111111</item_id>
        <price>12</price>
    </product>
</xml>

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    
    <xsl:template match="//product[@void='false']">
        
        <xsl:if test="item_id != //product[@void='true']/item_id">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:if>
        
    </xsl:template>
    
</xsl:stylesheet>

これに関する問題は、無効化されていない同じ ID を持つすべての製品を削除し、無効化されたアイテムの数と無効化されていないアイテムの数を考慮に入れていないことです。

無効な商品が 1 つある場合、無効化されていないが、それ自体とまったく同じタグを持つ 1 つの商品のみを削除する必要があります。

4

1 に答える 1

1

常に順番に表示されると仮定するproductsと、前の兄弟に対して true をチェックしてから、 を比較できますitem_id。最初の 2 つのアイテムには無効なトランザクションが先行していないため、それらは処理されません。そのため、if ステートメントを以下のように更新できます。

<xsl:if test="item_id = preceding-sibling::product[@void='true']/item_id">

それはあなたの期待される出力と一致します。

于 2013-11-06T15:51:59.897 に答える