2017-10-21 1 views
0

두 개의 날짜 필드를 비교하여 특정 값을 출력해야하는 xslt 문제가 있습니다. XML은 다음과 같습니다 : Eligibility_Date 오늘보다 큰 : 만 WD는 의료 보험 데이터에서 값을 선택하는 코드를 작성했습니다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> 

. 아래는 작동하지 않는 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:Workerwd:Worker 요소에 대해 또는에 대해 각각 앞으로 wd:COBRA_Eligibility_Datawd:EligibilityDate의 어린이가있을 것입니다. 아니면 원하는 다른 요소 일 수도 있습니다 : wd:HealthCareCoverageData을 언급하고 원하는 것일 수도 있습니다.

독자의 시선을 사로하는 첫 번째 문제는 각각의 노드에 대한 select 속성이 의도 된 노드 집합을 선택하지 않는다는 것입니다. 노드를 전혀 선택하지 않습니다. 대신 XSLT에 표시된 select의 주 연산자는 >입니다. 즉, 오류가없는 경우 부울 값을 포함하는 싱글 톤 시퀀스를 나타냅니다. 미래에 날짜를 나타내는 문서에 wd:EligibilityDate이 있으면 부울 값은 'true'가됩니다. 그러한 요소가 없으면 '거짓'이됩니다.

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

내가이 기대 : 그 순서 (는 싱글 순서, 그래서 항상 정확히 하나가있을 것입니다)는 XSLT 엔진이 하나 개 xsl:value-of 명령으로 구성된 시퀀스 생성자를 평가합니다 각각의 항목에 대해

스타일 시트를 실행하여 매번 실행될 때마다 'TRUE'라는 텍스트 노드 하나를 생성합니다. 표현 'TRUE'select 표현식으로 선택된 시퀀스의 모든 항목에 대해 한 번 평가되며 표현식 '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가 작동하는 방식과 사용자의 정신 모델간에 심각한 차이가있을 수 있음을 나타냅니다. 나는 튜토리얼이나 코스를 추천 할 것이다. 적어도, The Fine Manuals의 일부를 읽으십시오.