我的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>
答案 0 :(得分:1)
在xsl:for-each
中,select
属性用于选择项目序列。选择项目序列后,for-each
包含的序列构造函数将针对每个选定项目进行一次评估。
您没有描述您期望的结果,也无法解释您所获得的输出有什么问题。但是根据其可能的真实世界语义的数据和逻辑,看起来您希望对于每个wd:Worker
元素执行某些操作 ,对于这些元素,医疗保健资格日期将来,{em>或代表wd:COBRA_Eligibility_Data
个wd: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(.) > $today]]"
请注意,此表达式的值(禁止错误)将是当前上下文项(与模板匹配的wd:Worker
元素)或空序列。
如果你想为每个wd评估for-each的主体:将来包含可靠性日期的HealthCareCoverateData元素,你的选择需要看起来像这样:
select="descendant::wd:HealthCareCoverageData
[descendant::wd:Eligible_Date
[xs:date(.) > $today]]"
再次注意,通过查看此XPath,可以判断除非错误的值,如果非空,将是一系列元素。
从表面上看,你的代码表明XPath和XSLT的工作方式与你的心理模型之间可能存在严重的差距。我会推荐一些教程或课程。至少,阅读一些精细手册。