2017-10-21 290 views
0

我面臨與我的xslt問題,我需要根據兩個日期字段的比較輸出某個值。 XML是如下:使用XSLT比較日期

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

我已經寫代碼,只選擇醫療保險數據,其中WD值:Eligibility_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> 

回答

1

xsl:for-each中,select屬性用來選擇項目的順序。一旦選擇了項目序列,則for-each包含的序列構造函數將針對每個選定項目評估一次。

你沒有描述你期望得到的結果,也沒有解釋你所得到的輸出有什麼問題。但是根據其可能的現實世界語義的數據和邏輯,看起來好像您希望執行對於每個wd:Worker元素,對於未來的醫療保健資格日期,每個wd:COBRA_Eligibility_Data與未來的wd:EligibilityDate孩子。或者,也許這是你想要的其他元素:你提到wd:HealthCareCoverageData,也許這就是你想要的。

第一個引起讀者注意的問題是,for-each的select屬性沒有選擇任何可能的預定節點集。它根本不選擇任何節點。相反,所示XSLT中的select中的主要運算符爲>,這意味着在沒有錯誤的情況下表達式表示包含布爾值的單例序列。如果文檔中存在某個wd:EligibilityDate,則該布爾值將爲'true';如果沒有這樣的元素,它將是'假'。

對於該序列(這是一個單序列,所以總是會有隻有一個),XSLT引擎將評估由一個xsl:value-of指令序列構造每個項目:

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

我希望這個樣式表每次運行時只產生一個讀取「TRUE」的文本節點。應該強調的是,對select表達式選擇的序列中的每個項目,'TRUE'的表達式評估一次,並且由於表達式'TRUE'不以任何方式依賴於當前選擇的項目,所以結果將是相同的,無論布爾值select表達式是真或假。

或者更確切地說,如果您沒有收到錯誤消息,抱怨xs:date構造函數期望將單個字符串作爲參數,並且您將四個元素傳遞給它,而這些元素不能被強制轉換自動轉換成單個字符串。

如果你要評估的換每一次爲每個WD身體:工人在未來elibility日期,您的選擇將需要看起來像這樣:

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

注意,值(禁止錯誤)將是當前上下文項(匹配模板的wd:Worker元素)或空序列。

如果你想一次爲每個WD評估的換每個體:包含在未來elibility日期HealthCareCoverateData元素,您的選擇將需要看起來像這樣:

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

此外,請注意通過查看這個XPath,可以看出,如果非空,它將阻止錯誤的值,如果它是一個元素序列。

從表面上看,您的代碼表明XPath和XSLT的工作方式與您的心智模式之間可能存在嚴重差距。我會推薦一些教程或課程。至少,閱讀一些精細的手冊。