我需要知道给定的产品列表是否包含两个特定的产品。如果两者都存在,我需要忽略一个。如果只存在其中之一,则需要保留该产品。
XML 1
<ns0:Items xmlns:ns0="abc">
<ns0:Item>
<ns0:Code>X1</ns0:Code> <!-- keep this because it is the only one -->
<ns0:Quantity>1</ns0:Quantity>
</ns0:Item>
</ns0:Items>
XML 2
<ns0:Items xmlns:ns0="abc">
<ns0:Item>
<ns0:Code>X1</ns0:Code> <!-- ignore this because we have another valid product -->
<ns0:Quantity>1</ns0:Quantity>
</ns0:Item>
<ns0:Item>
<ns0:Code>M1</ns0:Code>
<ns0:Quantity>1</ns0:Quantity>
</ns0:Item>
</ns0:Items>
XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns0="abc" version="1.0">
<xsl:output method="xml" indent="yes" encoding="utf-16" omit-xml-declaration="no" />
<xsl:template match="ns0:Items">
<Items>
<xsl:variable name="hasBoth">
<xsl:value-of select="boolean(ns0:Item/ns0:Code[.='M1']) and boolean(ns0:Item/ns0:Code[.='X1'])" />
</xsl:variable>
<xsl:for-each select="ns0:Item">
<xsl:variable name="validItem">
<xsl:choose>
<xsl:when test="$hasBoth and ns0:Code='X1' and ns0:Quantity=1">
<xsl:value-of select="0"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<both>
<xsl:value-of select="$hasBoth"/>
</both>
<expr>
<xsl:value-of select="$hasBoth and ns0:Code='X1' and ns0:Quantity=1"/>
</expr>
<valid>
<xsl:value-of select="$validItem"/>
</valid>
<xsl:if test="$validItem = 1">
<SalesOrderDetail>
<xsl:copy-of select="."/>
</SalesOrderDetail>
</xsl:if>
</xsl:for-each>
</Items>
</xsl:template>
</xsl:stylesheet>
结果1-这是错误的,即使它是唯一的产品,它也会删除X1产品,$ hasBoth是否为假,expr是否为真?
<Items>
<both>false</both>
<expr>true</expr>
<valid>0</valid>
</Items>
结果2-正确,它删除了X1产品
<Items>
<both>true</both>
<expr>true</expr>
<valid>0</valid>
<both>true</both>
<expr>false</expr>
<valid>1</valid>
<SalesOrderDetail>
</SalesOrderDetail>
</Items>
最佳答案
我认为这与您的hasBoth
变量有关。在创建xsl:value-of
时使用它时,结果是一个字符串。
当测试$hasBoth
时,即使字符串值为“ false”,它也为true,因为:
boolean("false") = true()
另外,您不需要使用
boolean()
。尝试更改此:
<xsl:variable name="hasBoth">
<xsl:value-of select="boolean(ns0:Item/ns0:Code[.='M1']) and boolean(ns0:Item/ns0:Code[.='X1'])" />
</xsl:variable>
对此:
<xsl:variable name="hasBoth"
select="ns0:Item/ns0:Code[.='M1'] and ns0:Item/ns0:Code[.='X1']"/>