2012-03-21 5 views
2

저는 처음으로 xslt로 작업하고 있습니다. 저는 2.0을 가지고 있습니다. 그러나 이것이 우리가 가지고있는 C# 변환 라이브러리로 접근 할 수있는 유일한 이점입니다. 12 년 전의 날짜를 포함하고 특정 유형의 속성이있는 XML 문서의 자식 노드를 세지려고합니다.xslt를 사용하여 날짜 조건에 기반한 XML 계산하기

샘플 XML 구조 : <... />이 몇 가지 추가 관련이없는 물건을 의미

<xml version=\"1.0\" encoding=\"utf-8\"?> 
<... /> 
<Dependents> 
<Dependent><DOB>1964-04-01</DOB><DependentType>Spouse</DependentType></Dependent> 
<Dependent><DOB>2000-01-01</DOB><DependentType>Child</DependentType></Dependent> 
<Dependent><DOB>2012-01-01</DOB><DependentType>Child</DependentType></Dependent> 
</Dependents> 
<... /> 

.

본질적으로 나는 12 세 미만의 어린이를 원합니다. (나는 모든 연령층의 dependenttype = 자녀 수를 가지고 있으며, 12 세 미만은 문제를 일으킨다.) 나에게 제안 된 접근 방식은 오늘부터 12 년 전의 변수를 만들고이를 count() 함수의 비교를위한 기초로 사용하는 것입니다. 합리적인 것 같지만 쉽고 간편한 답변을 위해 이와 같은 질문에 자주 연결되는 제 3 자 라이브러리 (예 : exslt)를 사용하지 않고도 날짜를 만들지 않아도됩니다.

내가 지금까지이 때문이다 왔 XSLT :

<xsl:variable name="today" select="current-dateTime()" as="xs:dateTime" /> 
<xsl:variable name="twelveyearsago" select="xs:dateTime(concat(year-from-dateTime($today) - 12, '-', month-from-dateTime($today), '-', day-from-dateTime($today)))" /> 
<xsl:text>12yearsago=</xsl:text><xsl:value-of select="$twelveyearsago" /> 

그리고 달에서-dateTime을 (그리고 상정 일상에서-dateTime으로는) 앞에 0을 추가하지 않기 때문에이 작동하지 않습니다. 2012 년 3 월 21 일 현재 Saxon.Api.DynamicError : dateTime 값이 "2000-3-21"(월이 두 자리 여야 함)입니다. (W3Schools xpath function reference이어야 함을 의미하지만 .)

내가 출력하고 싶은 것은 :

<xsl:text>&amp;numberofchildren=</xsl:text><xsl:value-of select="count(//InsuranceRequest/HealthInsurance/Dependents/Dependent/DependentType[text() = 'Child'])" /> 
<xsl:text>&amp;childrenunder12=</xsl:text><xsl:value-of select="children under twelve" /> 

더 많은 나는이에 대한 내 머리 파운드, 더 난 그냥 보이지 않아요 간단한 방법 거기 같은 느낌.

편집 : xslt 구문이 유효하고 이중 인용 부호가없는 C# 문자열이되도록 정리했습니다.

답변

3

<xsl:variable name="twelveyearsago" select="$today - xs:yearMonthDuration('P12Y')"/>처럼 12 년의 duration을 간단히 뺄 수 있습니다. //Dependent[DependentType = 'Child' and xs:date(DOB) >= $twelveyearsago].

[편집] 여기 컴파일 색슨 9.4 함께 잘 실행하는 템플릿입니다 :

<xsl:template match="/"> 
    <xsl:variable name="today" select="current-date()"/> 
    <xsl:variable name="twelve-years-ago" select="$today - xs:yearMonthDuration('P12Y')"/> 
    <xsl:value-of select="count(//Dependent[DependentType = 'Child' and xs:date(DOB) >= $twelve-years-ago])"/> 
    </xsl:template> 
+0

은'내가 이전에 작동하지 않는 맹세하지만 yearMonthDuration'가 잘 작동하고 ... 바보 구문 내 부분에 오류가있어 의심의 여지가 없습니다. 그러나, 나는'DependedType = 'Child'가 맞다고 생각하지 않는다. 나는 텍스트()를 어떻게 든 참조해야한다고 생각한다. 적어도, 당신이 그것을 쓴 것처럼 작동하지 않습니다. 지금 몇 가지 시도하고 있지만 힌트가 있으면 감사하겠습니다. –

+0

원한다면'Dependent [DependentType/text() = 'Child']'를 사용할 수 있지만, 필자가 제안한 것만으로도 충분하고 제 견해에서는 더 일반적으로 사용됩니다. 텍스트 노드를 명시 적으로 선택하는 것은 혼합 된 컨텐츠를 다룰 때만 필요합니다. 무언가를 얻는 데 여전히 문제가 있다면 사용 가능한 코드 샘플은 물론이고 최소한이지만 완성품을 게시하면 해결할 수 있다고 확신합니다. 하지만 나는'DependentType = 'Child'가 작업 코드라는 것을 확신시키기 위해 C# 문자열을 XML 문서로 작업하려고하지 않습니다. 유일한 문제는 타이핑이나 잘못된 이름을 가진'DependedType = 'Child ''입니다. –

+0

당신은이'count (// Dependents/Dependents [DependentType = 'Child']'는 작동하지만,'count (// Dependents/Dependents [xs : date (DOB)] = $ twelveyearsago ])''작동하지 않습니다. 오타를 유감스럽게 생각합니다. –

관련 문제