我有一个带有多个节点的xml,并且我尝试使用xpath 1.0根据“和”条件获取节点。我尝试在for-each子句中使用contains,当我仅使用一个[contains(DateType,'CAOSL')]时,它返回结果,但是当我添加'and'子句时,即使有2个节点,也不会返回结果符合条件的 如果有人可以指出出什么问题或指出正确的做法,我将不胜感激。
谢谢。
我在xslt文件中尝试了for-each,如下所示。第一个返回具有匹配CAOSL的节点,但and条件失败。
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>
答案 0 :(得分:1)
您的数据不包含具有包含CAOSL的DateType和包含USOSL的DateType的SupplyDate。
所以您的逻辑不正确,但是我无法从您的问题中得出您的实际要求是什么。
顺便说一句,我认为您误解了contains()
的功能,尽管这不是您的主要错误。给定元素ABCXYZ,contains(a, "ABC")
返回true。我认为您希望a = "ABC"
仅在ABC是节点的整个字符串值时才返回true。