Xml 使用XSLT比较日期

Xml 使用XSLT比较日期,xml,xslt,Xml,Xslt,我的xslt遇到了一个问题,我需要根据两个日期字段的比较来输出某些值。XML如下所示: <wd:Worker xmlns:wd="urn:com.workday/bsvc" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> <wd:Worker_Reference wd:Descriptor="will Test"> <wd:ID wd:type="Employee_ID

我的xslt遇到了一个问题,我需要根据两个日期字段的比较来输出某些值。XML如下所示:

<wd:Worker xmlns:wd="urn:com.workday/bsvc" 
           xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <wd:Worker_Reference wd:Descriptor="will Test">
    <wd:ID wd:type="Employee_ID">11111</wd:ID>
  </wd:Worker_Reference>
  <wd:Worker_Data>
    <wd:Benefit_Enrollment_Data>
      <wd:Health_Care_Data>
        <wd:Health_Care_Period_Data>
          <wd:Health_Care_Coverage_Data>
            <wd:Dependent_Coverage_Data>
              <wd:COBRA_Eligibility_Data>
                <wd:Eligible_Date>2017-10-25-07:00</wd:Eligible_Date>
                <wd:Benefit_Plan_Reference wd:Descriptor="Dental - MetLife">
                  <wd:ID wd:type="Health_Care_Coverage_Plan_ID">Dental-MetLife</wd:ID>
                </wd:Benefit_Plan_Reference>
              </wd:COBRA_Eligibility_Data>
              <wd:COBRA_Eligibility_Data>
                <wd:Eligible_Date>2017-10-25-07:00</wd:Eligible_Date>
                <wd:Benefit_Plan_Reference wd:Descriptor="Vision - VSP">
                  <wd:ID wd:type="Health_Care_Coverage_Plan_ID">Vision -VSP</wd:ID>
                </wd:Benefit_Plan_Reference>
              </wd:COBRA_Eligibility_Data>
            </wd:Dependent_Coverage_Data>
          </wd:Health_Care_Coverage_Data>
          <wd:Health_Care_Coverage_Data>
            <wd:Dependent_Coverage_Data>
              <wd:COBRA_Eligibility_Data>
                <wd:Eligible_Date>2016-10-20-07:00</wd:Eligible_Date>
                <wd:Benefit_Plan_Reference wd:Descriptor="Dental - MetLife">
                  <wd:ID wd:type="Health_Care_Coverage_Plan_ID">Dental-MetLife</wd:ID>
                </wd:Benefit_Plan_Reference>
              </wd:COBRA_Eligibility_Data>
              <wd:COBRA_Eligibility_Data>
                <wd:Eligible_Date>2016-10-20-07:00</wd:Eligible_Date>
                <wd:Benefit_Plan_Reference wd:Descriptor="Vision - VSP">
                  <wd:ID wd:type="Health_Care_Coverage_Plan_ID">Vision -VSP</wd:ID>
                </wd:Benefit_Plan_Reference>
              </wd:COBRA_Eligibility_Data>
            </wd:Dependent_Coverage_Data>
          </wd:Health_Care_Coverage_Data>
        </wd:Health_Care_Period_Data>
      </wd:Health_Care_Data>
    </wd:Benefit_Enrollment_Data>
  </wd:Worker_Data>
</wd:Worker>

11111
2017-10-25-07:00
牙科大都会人寿
2017-10-25-07:00
视觉-VSP
2016-10-20-07:00
牙科大都会人寿
2016-10-20-07:00
视觉-VSP
我必须编写代码,仅从医疗覆盖数据中选择值,其中wd:qualification\u Date大于今天。下面是我的xsl,它不起作用。请帮助:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:wd="urn:com.workday/bsvc"
                xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
                exclude-result-prefixes="xs wd env"
               version="2.0">

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

  <xsl:template match="/wd:Worker">    

    <xsl:variable name="today" select="current-date()"/>                 
    <Mydata>          
      <cobra>                           
        <xsl:for-each 
            select="xs:date(/wd:Worker
                            /wd:Worker_Data
                            /wd:Benefit_Enrollment_Data
                            /wd:Health_Care_Data
                            /wd:Health_Care_Period_Data
                            /wd:Health_Care_Coverage_Data
                            /wd:Dependent_Coverage_Data
                            /wd:COBRA_Eligibility_Data
                            /wd:Eligible_Date) 
                    &gt;$today ">                  
          <xsl:value-of select="'TRUE'"/>   
        </xsl:for-each>                 
      </cobra>
    </Mydata> 
  </xsl:template>
</xsl:stylesheet>

xsl:for each
中,使用
select
属性选择项目序列。一旦选择了项目序列,则每个所选项目的
包含的序列构造函数将被评估一次

你没有描述你所期望的结果,也没有解释你所得到的结果的错误之处。但是,从数据及其可能的现实世界语义逻辑来看,似乎您希望对未来有医疗合格日期的每个
wd:Worker
元素执行某些操作,或者对未来有
wd:EligibilityDate
子项的每个
wd:COBRA\u合格性\u数据执行某些操作。或者可能是你想要的其他元素:你提到的
wd:HealthCareCoverageData
,可能就是你想要的

读者注意到的第一个问题是,for each上的
select
属性没有选择任何可能需要的节点集。它根本没有选择任何节点。相反,所示XSLT中的
select
中的主运算符是
,这意味着在没有错误的情况下,表达式表示包含布尔值的单例序列。如果文档中存在表示未来日期的
wd:EligibilityDate
,则布尔值将为“true”;如果没有此类元素,则为“false”

对于该序列中的每个项(它是一个单例序列,因此始终只有一个),XSLT引擎将评估由一个
xsl:value of
指令组成的序列构造函数:

<xsl:value-of select="'TRUE'"/>  
请注意,此表达式的值(禁止错误)将是当前上下文项(匹配模板的
wd:Worker
元素)或空序列

如果您希望为将来包含可删除日期的每个wd:HealthCareCoverateData元素对的主体进行一次评估,您的选择将需要如下所示:

select=".[descendant::wd:Eligible_Date[xs:date(.) &gt; $today]]"
select="descendant::wd:HealthCareCoverageData
          [descendant::wd:Eligible_Date
          [xs:date(.) &gt; $today]]"
再次请注意,通过查看此XPath可以看出,除非出现错误,否则其值(如果非空)将是一个元素序列

从表面上看,您的代码表明XPath和XSLT的工作方式与您的思维模式之间可能存在严重的差距。我会推荐一些教程或课程。至少,阅读一些优秀的手册