我有一个问题试图在XSLT中解决,但是我找不到解决方案。以下示例与支付系统有关,该系统将商品添加到购物篮中然后将其删除。out XML提供了对一篮子操作的审核跟踪。
添加项目(编号1)
添加价格变化的商品(编号1)
无效物品(编号1)
无效物品(编号1)价格有变动
添加项目(编号1)
添加项目(编号1)
去掉:
添加项目(编号1)
添加价格变化的商品(编号1)
无效物品(编号1)
无效物品(编号1)价格有变动
添加项目(编号1)
添加项目(编号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个无效商品,则应该只删除一个没有无效但标签与商品完全相同的商品
假设您products
始终按顺序显示,则可以检查前面的兄弟姐妹是否为true,然后比较item_id
。由于您的前两个项目之前没有无效交易,因此不会对其进行处理。因此,您可以将if语句更新为以下内容:
<xsl:if test="item_id = preceding-sibling::product[@void='true']/item_id">
这将与您的预期输出匹配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句