使用XSLT比较日期

时间:2017-10-21 22:21:31

标签: xml xslt

我的xslt面临问题,我需要根据两个日期字段的比较输出特定值。 XML如下:

auto enumsList = getFullEnumList<MyEnum>();
-- OR --
auto enumsList = getFullEnumList<MyEnum>(2, 4);

我编写代码只从医疗保险范围数据中选择值,其中wd:Eligibility_Date大于今天。下面是我的xsl,它不起作用。请帮忙:

<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>

1 个答案:

答案 0 :(得分:1)

xsl:for-each中,select属性用于选择项目序列。选择项目序列后,for-each包含的序列构造函数将针对每个选定项目进行一次评估。

您没有描述您期望的结果,也无法解释您所获得的输出有什么问题。但是根据其可能的真实世界语义的数据和逻辑,看起来您希望对于每个wd:Worker元素执行某些操作 ,对于这些元素,医疗保健资格日期将来,{em>或代表wd:COBRA_Eligibility_Datawd:EligibilityDate个孩子。或者也许它是你想要的其他元素:你提到wd:HealthCareCoverageData,或许那就是你想要的那个。

引起读者注意的第一个问题是,for-each上的select属性并未选择任何可能的预期节点集。它根本没有选择任何节点。相反,显示的XSLT中的select中的主运算符是>,这意味着在没有错误的情况下,表达式表示包含布尔值的单个序列。布尔值将为&#39; true&#39;如果文档中有一些wd:EligibilityDate表示将来的日期;这将是“假”&#39;如果没有这样的元素。

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

<xsl:value-of select="'TRUE'"/>  

我希望这个样式表只能生成一个文本节点读取&#39; TRUE&#39;每次运行。应该强调的是,对'TRUE'表达式选择的序列中的每个项目计算表达式select一次,因为表达式'TRUE'不依赖于任何当前所选项目方式,无论select表达式的布尔值是真还是假,结果都是相同的。

或者更确切地说,如果您没有收到错误消息抱怨xs:date构造函数需要单个字符串作为参数,并且您正在传递它,那么我所说的所有内容都将成立四个元素,不能自动强制转换为单个字符串。

如果你想为每个wd评估一次for-body的正文:将来有精灵日期的工人,你的选择需要看起来像这样:

select=".[descendant::wd:Eligible_Date[xs:date(.) &gt; $today]]"

请注意,此表达式的值(禁止错误)将是当前上下文项(与模板匹配的wd:Worker元素)或空序列。

如果你想为每个wd评估for-each的主体:将来包含可靠性日期的HealthCareCoverateData元素,你的选择需要看起来像这样:

select="descendant::wd:HealthCareCoverageData
          [descendant::wd:Eligible_Date
          [xs:date(.) &gt; $today]]"

再次注意,通过查看此XPath,可以判断除非错误的值,如果非空,将是一系列元素。

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