【问题标题】:How to compare a single value to an array using XSLT如何使用 XSLT 将单个值与数组进行比较
【发布时间】:2020-02-16 02:47:16
【问题描述】:

如果单个值存在于数组中,我想比较它。我有一个 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:pubbsServicewd: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>

【问题讨论】:

  • 首先,虽然带有 XPath 3.1 的 XSLT 3 具有数组数据类型,但它是对先前 XSLT 2 数据模型的扩展,用于处理 JSON 数组并在以下情况下具有可嵌套的轻量级数据结构不使用 XML;你的问题显示了 XML 数据,所以我看不出你会如何在那里遇到任何数组。至于您现有的代码,当它不起作用时,您究竟会得到哪个错误?或者你得到哪个错误的输出,哪个是你想要的显示输入样本的确切结果?

标签: xslt-2.0 xslt-3.0


【解决方案1】:

我尝试使用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 给出一个空的&lt;PUBBS/&gt;,这似乎是唯一的正确结果,因为CFI_ARI_PUBBS_HSA_group 具有pubbsService 的值FMDAUTOPSY 具有CF_FD_PUBBS_HSA_Valid_To_Date2100-01-01CFI_FD_PUBBS_HSA_Current_Date 2020-02-16 的值不大于该值。

您是否想要HASINVALIDSALESITEM 的单个输出还不太清楚,即使有多个,但代码显然可以适应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2019-04-06
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多