Как сравнить одно значение с массивом, используя XSLT - PullRequest
0 голосов
/ 16 февраля 2020

Я хочу сравнить одно значение, если оно существует, с массивом. У меня есть XML входной файл:

<wd:Report_Entry
    xmlns:wd="urn:com.workday.report/CRI_-_INTSG031_CM_011_-_PUBBS_HSA_Customer_Invoice">
    <wd:CFI_ARI_PUBBS_HSA_group>
        <wd:pubbsType>1</wd:pubbsType>
        <wd:pubbsService>A+</wd:pubbsService>
        <wd:validFrom>2019-08-01</wd:validFrom>
        <wd:validTo>2100-01-01</wd:validTo>
        <wd:CF_FD_PUBBS_HSA_Valid_From_Date>2019-08-01</wd:CF_FD_PUBBS_HSA_Valid_From_Date>
        <wd:CF_FD_PUBBS_HSA_Valid_To_Date>2100-01-01</wd:CF_FD_PUBBS_HSA_Valid_To_Date>
    </wd:CFI_ARI_PUBBS_HSA_group>
    <wd:CFI_ARI_PUBBS_HSA_group>
        <wd:pubbsType>1</wd:pubbsType>
        <wd:pubbsService>A-</wd:pubbsService>
        <wd:validFrom>2019-08-01</wd:validFrom>
        <wd:validTo>2100-01-01</wd:validTo>
        <wd:CF_FD_PUBBS_HSA_Valid_From_Date>2019-08-01</wd:CF_FD_PUBBS_HSA_Valid_From_Date>
        <wd:CF_FD_PUBBS_HSA_Valid_To_Date>2100-01-01</wd:CF_FD_PUBBS_HSA_Valid_To_Date>
    </wd:CFI_ARI_PUBBS_HSA_group>
    <wd:CFI_ARI_PUBBS_HSA_group>
        <wd:pubbsType>FMDAUTOPSY</wd:pubbsType>
        <wd:pubbsService>FMDAUTOPSY</wd:pubbsService>
        <wd:validFrom>2020-02-02</wd:validFrom>
        <wd:validTo>2020-02-01</wd:validTo>
        <wd:CF_FD_PUBBS_HSA_Valid_From_Date>2020-02-01</wd:CF_FD_PUBBS_HSA_Valid_From_Date>
        <wd:CF_FD_PUBBS_HSA_Valid_To_Date>2100-01-01</wd:CF_FD_PUBBS_HSA_Valid_To_Date>
    </wd:CFI_ARI_PUBBS_HSA_group>
    <wd:CFI_ARI_PUBBS_HSA_group>
        <wd:pubbsType>FMDBODYSTOR</wd:pubbsType>
        <wd:pubbsService>FMDBODYSTOR</wd:pubbsService>
        <wd:validFrom>2020-01-01</wd:validFrom>
        <wd:validTo>2020-01-31</wd:validTo>
        <wd:CF_FD_PUBBS_HSA_Valid_From_Date>2020-01-01</wd:CF_FD_PUBBS_HSA_Valid_From_Date>
        <wd:CF_FD_PUBBS_HSA_Valid_To_Date>2020-01-31</wd:CF_FD_PUBBS_HSA_Valid_To_Date>
    </wd:CFI_ARI_PUBBS_HSA_group>
 <wd:Customer_Invoice_Lines_group>
        <wd:referenceID>CUSTOMER_INVOICE_LINE-6-46</wd:referenceID>
        <wd:Unit_Cost>0</wd:Unit_Cost>
        <wd:Quantity>0</wd:Quantity>
        <wd:Calculated_Tax_Amount>0</wd:Calculated_Tax_Amount>
        <wd:CFI_AC_Merchandise_Amount>100</wd:CFI_AC_Merchandise_Amount>
        <wd:Line_Item_Description>LINE ITEM DESC</wd:Line_Item_Description>
        <wd:Line_Memo>LINE MEMO</wd:Line_Memo>
        <wd:Transaction_Tax_Amount>0</wd:Transaction_Tax_Amount>
        <wd:CFI_LRV_Sales_Item_Reference_ID>FMDAUTOPSY</wd:CFI_LRV_Sales_Item_Reference_ID>
    </wd:Customer_Invoice_Lines_group>
    <wd:CFI_FD_PUBBS_HSA_Current_Date>2020-02-16</wd:CFI_FD_PUBBS_HSA_Current_Date>
</wd:Report_Entry>

Я хочу знать, равно ли значение wd:CFI_LRV_Sales_Item_Reference_ID wd:Customer_Invoice_Lines_group/wd:CFI_ARI_PUBBS_HSA_group/wd:pubbsService и wd:CFI_FD_PUBBS_HSA_Current_Date больше wd:CF_FD_PUBBS_HSA_Valid_To_Date, а затем просто вернуть строку Значение true, если есть. У меня есть такой код, но он не работает, потому что я сравниваю значение с объектом, который имеет несколько значений. Не уверен, как сравнить одно значение с массивом, используя xslt 2 или 3. Оцените помощь.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mf="http://example.com/mf"
    exclude-result-prefixes="#all" version="3.0"
    xmlns:wd="urn:com.workday.report/CRI_-_INTSG031_CM_011_-_PUBBS_HSA_Customer_Invoice"
    xmlns:d9="urn:this-stylesheet">

    <xsl:output method="xml"/>

    <xsl:template match="/">
        <PUBBS>      


            <xsl:for-each select="wd:Report_Entry/wd:Customer_Invoice_Lines_group">
                <xsl:if test="wd:CFI_LRV_Sales_Item_Reference_ID != ''">
                    <xsl:for-each select="../wd:CFI_ARI_PUBBS_HSA_group">
                        <xsl:if test="../wd:CFI_ARI_PUBBS_HSA_group/wd:pubbsService != '' 
                            and wd:CFI_LRV_Sales_Item_Reference_ID = ../wd:CFI_ARI_PUBBS_HSA_group/wd:pubbsService
                            and xs:date(../wd:CFI_FD_PUBBS_HSA_Current_Date) &gt; xs:date(../wd:CFI_ARI_PUBBS_HSA_group/wd:CF_FD_PUBBS_HSA_Valid_To_Date)
                            ">    
                            <HASINVALIDSALESITEM>
                                <xsl:value-of select="'true'"/>
                            </HASINVALIDSALESITEM>   
                        </xsl:if>
                    </xsl:for-each>
                </xsl:if>  
            </xsl:for-each>
    </PUBBS>
    </xsl:template>
</xsl:stylesheet>

1 Ответ

0 голосов
/ 16 февраля 2020

Я попытался упростить код с помощью xpath-default-namespace и с помощью шаблонов; Я также предположил, что два значения, которые вы хотите сравнить две детали различных CFI_ARI_PUBBS_HSA_group, существуют только один раз во входном документе:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="urn:com.workday.report/CRI_-_INTSG031_CM_011_-_PUBBS_HSA_Customer_Invoice"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:mode on-no-match="shallow-skip"/>

  <xsl:template match="/*">
      <PUBBS>
          <xsl:apply-templates select="CFI_ARI_PUBBS_HSA_group"/>
      </PUBBS>
  </xsl:template>

  <xsl:template match="CFI_ARI_PUBBS_HSA_group[xs:date(//CFI_FD_PUBBS_HSA_Current_Date) > xs:date(CF_FD_PUBBS_HSA_Valid_To_Date)
                       and
                       //CFI_LRV_Sales_Item_Reference_ID = pubbsService]">
     <HASINVALIDSALESITEM>true</HASINVALIDSALESITEM> 
  </xsl:template>

</xsl:stylesheet>

При https://xsltfiddle.liberty-development.net/jz1Q1ym, что дает пустой <PUBBS/>, который кажется правильным результатом как единственный CFI_ARI_PUBBS_HSA_group с pubbsService, имеющим значение FMDAUTOPSY, имеет CF_FD_PUBBS_HSA_Valid_To_Date 2100-01-01, а CFI_FD_PUBBS_HSA_Current_Date со значением 2020-02-16 не больше чем это.

Не совсем ясно, хотите ли вы один вывод HASINVALIDSALESITEM, даже если их несколько, но код, очевидно, может быть адаптирован.

...