我有一个包含多个节点的xml,我正试图使用xpath 1.0基于"and"条件提取节点。我尝试在for each子句中使用contains,当我只使用一个[contains(DateType,'CAOSL'(]时,它会返回结果,但当我添加'and'子句时,即使有2个节点符合条件,也不会返回结果。如果有人能指出问题所在或为我指明正确的做法,我将不胜感激
提前谢谢。
我在xslt文件中尝试了如下的for each。第一个返回具有匹配CAOSL的节点,但条件和失败。
XML:
<Products>
<Product>
<ProductSupply>
<SupplyDetail>
<Supplier>
<SupplierRole>01</SupplierRole>
<SuppierName>Test</SuppierName>
</Supplier>
<ProductAvailability>21</ProductAvailability>
<SupplyDate>
<SupplyDateRole>00</SupplyDateRole>
<Date>1464739200</Date>
<DateCountry>NZ</DateCountry>
<DateType>NZPUB</DateType>
</SupplyDate>
<SupplyDate>
<SupplyDateRole>00</SupplyDateRole>
<Date>1464739200</Date>
<DateCountry>AU</DateCountry>
<DateType>AUPUB</DateType>
</SupplyDate>
<SupplyDate>
<SupplyDateRole>00</SupplyDateRole>
<Date>1496102400</Date>
<DateCountry>CA</DateCountry>
<DateType>CAOSL</DateType>
</SupplyDate>
<SupplyDate>
<SupplyDateRole>00</SupplyDateRole>
<Date>1480550400</Date>
<DateCountry>UK</DateCountry>
<DateType>UKOSL</DateType>
</SupplyDate>
<SupplyDate>
<SupplyDateRole>00</SupplyDateRole>
<Date>1464739200</Date>
<DateCountry>NZ</DateCountry>
<DateType>NZSHD</DateType>
</SupplyDate>
<SupplyDate>
<SupplyDateRole>02</SupplyDateRole>
<Date>1463961600</Date>
<DateCountry>AU</DateCountry>
<DateType>AUOSL</DateType>
</SupplyDate>
<SupplyDate>
<SupplyDateRole>00</SupplyDateRole>
<Date>1464566400</Date>
<DateCountry>NZ</DateCountry>
<DateType>NZOSL</DateType>
</SupplyDate>
<SupplyDate>
<SupplyDateRole>08</SupplyDateRole>
<Date>1464739200</Date>
<DateCountry>AU</DateCountry>
<DateType>AUSHD</DateType>
</SupplyDate>
<SupplyDate>
<SupplyDateRole>00</SupplyDateRole>
<Date>1496102400</Date>
<DateCountry>US</DateCountry>
<DateType>USOSL</DateType>
</SupplyDate>
</SupplyDetail>
</ProductSupply>
</Product>
XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:template match="Products">
<Products>
<xsl:apply-templates select="Product" />
</Products>
</xsl:template>
<xsl:template match="Product">
<product>
<productsupply>
<supplydetail>
<xsl:for-each select="ProductSupply/SupplyDetail/SupplyDate[contains(DateType, 'CAOSL') and contains(DateType, 'USOSL')]">
<supplydate>
<DateType>
<xsl:value-of select="DateType" />
</DateType>
<DateCountry>
<xsl:value-of select="DateCountry" />
</DateCountry>
</supplydate>
</xsl:for-each>
</supplydetail>
</productsupply>
</product>
</xsl:template>
</xsl:stylesheet>
输出:
<result>
<SupplyDate>
<SupplyDateRole>00</SupplyDateRole>
<Date>1496102400</Date>
<DateCountry>CA</DateCountry>
<DateType>CAOSL</DateType>
</SupplyDate>
<SupplyDate>
<SupplyDateRole>00</SupplyDateRole>
<Date>1496102400</Date>
<DateCountry>US</DateCountry>
<DateType>USOSL</DateType>
</SupplyDate>
您的数据不包括同时具有包含CAOSL的DateType和包含USOSL的DateType的SupplyDate。
所以你的逻辑是不正确的,但我无法从你的问题中得出你的实际要求是什么
顺便说一句,我认为您误解了contains()
的作用,尽管这不是您的主要错误。给定元素ABCXYZ,contains(a, "ABC")
返回true。我认为您想要a = "ABC"
,它只有在ABC是节点的整个字符串值时才返回true。