我有一个问题,我试图在XSLT中解决,但我无法找到解决方案。以下示例与支付系统相关,它将项目添加到购物篮然后将其删除。 out XML提供了对篮子进行的操作的审计跟踪。
添加项目(Id 1)
添加物品(Id 1),价格变动
无效项目(Id 1)
无效项目(Id 1)价格变动
添加项目(Id 1)
添加项目(Id 1)
卸下:
添加项目(Id 1)
添加物品(Id 1),价格变动
无效项目(Id 1)
无效项目(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>
这样做的问题是它正在删除所有没有作废但具有相同内容的产品,并且没有考虑无效项目的数量与无效项目的数量。
如果你有1个无效项目,它应该只删除一个没有空白但与自身具有完全相同标签的产品
答案 0 :(得分:1)
假设您的products
始终按顺序显示,您可以检查前一个兄弟为真,然后比较item_id
。由于前两个项目之前没有void事务,因此它不会处理它们。因此,您可以将if语句更新为以下内容:
<xsl:if test="item_id = preceding-sibling::product[@void='true']/item_id">
然后匹配您的预期输出。