Xml 使用XSLT比较日期
我的xslt遇到了一个问题,我需要根据两个日期字段的比较来输出某些值。XML如下所示: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
<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)
>$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(.) > $today]]"
select="descendant::wd:HealthCareCoverageData
[descendant::wd:Eligible_Date
[xs:date(.) > $today]]"
再次请注意,通过查看此XPath可以看出,除非出现错误,否则其值(如果非空)将是一个元素序列
从表面上看,您的代码表明XPath和XSLT的工作方式与您的思维模式之间可能存在严重的差距。我会推荐一些教程或课程。至少,阅读一些优秀的手册