XSLT для каждого с и условие - PullRequest
0 голосов
/ 24 октября 2019

У меня есть xml с несколькими узлами, и я пытаюсь извлечь узлы на основе условия 'и', используя xpath 1.0. Я попытался использовать содержимое в предложении for-each, когда я использую только один [contains (DateType, 'CAOSL')], он возвращает результат, но когда я добавляю предложение 'and', результат не возвращается, даже если существует 2 узла. которые соответствуют условию. Я был бы признателен, если кто-то может указать, что не так или указать мне правильный способ сделать это.

Заранее спасибо.

Я пробовал for-each, как показано ниже в файле xslt,Первый возвращает узел с соответствующим 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>

1 Ответ

1 голос
/ 25 октября 2019

Ваши данные не включают в себя SupplyDate с датой DateType, содержащей CAOSL, и DateType, содержащей USOSL.

Итак, ваша логика неверна, но я не могу понять из вашего вопроса, каковы ваши реальные требования.

Кстати, я думаю, вы неправильно поняли, что делает contains(), хотя это не ваша основная ошибка. Для данного элемента ABCXYZ contains(a, "ABC") возвращает true. Я думаю, что вы хотите a = "ABC", который возвращает true, только если ABC - это полное строковое значение узла.

...