XSLT for-each具有和条件

时间:2019-10-24 16:58:27

标签: xslt xslt-1.0

我有一个带有多个节点的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>

1 个答案:

答案 0 :(得分:1)

您的数据不包含具有包含CAOSL的DateType和包含USOSL的DateType的SupplyDate。

所以您的逻辑不正确,但是我无法从您的问题中得出您的实际要求是什么。

顺便说一句,我认为您误解了contains()的功能,尽管这不是您的主要错误。给定元素ABCXYZ,contains(a, "ABC")返回true。我认为您希望a = "ABC"仅在ABC是节点的整个字符串值时才返回true。