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 つの商品のみを削除する必要があります。