2

我有一个问题,我试图在 XSLT 中解决,但我无法找到解决方案。下面的示例与一个支付系统相关,它将项目添加到篮子然后删除它们。输出 XML 提供对篮子执行的操作的审计跟踪。

塞纳里奥:

添加项目(ID 1)

添加项目 (Id 1) 并更改价格

无效物品 (Id 1)

无效项目 (Id 1) 有价格变化

添加项目(ID 1)

添加项目(ID 1)

预期结果

消除:

添加项目(ID 1)

添加项目 (Id 1) 并更改价格

输出 XML 包含

无效物品 (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>

这样做的问题是它正在删除所有未作废且具有相同 ID 的产品,并且没有考虑作废商品的数量与非作废商品的数量。

如果您有 1 件无效商品,则应仅删除一件未作废但标签与其自身完全相同的商品

4

1 回答 1

1

假设您products总是按顺序出现,您可以检查前一个兄弟姐妹是否为真,然后比较item_id. 由于您的前两个项目之前没有无效交易,因此不会处理这些。因此,您可以将 if 语句更新为以下内容:

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

这将与您的预期输出相匹配。

于 2013-11-06T15:51:59.897 回答