XSLT排除特定标记

时间:2013-11-06 15:04:43

标签: xml xslt

我有一个问题,我试图在XSLT中解决,但我无法找到解决方案。以下示例与支付系统相关,它将项目添加到购物篮然后将其删除。 out 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>

这样做的问题是它正在删除所有没有作废但具有相同内容的产品,并且没有考虑无效项目的数量与无效项目的数量。

如果你有1个无效项目,它应该只删除一个没有空白但与自身具有完全相同标签的产品

1 个答案:

答案 0 :(得分:1)

假设您的products始终按顺序显示,您可以检查前一个兄弟为真,然后比较item_id。由于前两个项目之前没有void事务,因此它不会处理它们。因此,您可以将if语句更新为以下内容:

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

然后匹配您的预期输出。