2013-06-14 2 views
0

편집 : 답변을 찾은 것 같지만 누군가가 수정/개선 사항이 있는지 확인하기 위해 공개적으로 남겨 둘 것입니다.xpath - 현재 노드에서 하위 노드의 값과 부모 노드의 값이 일치합니다.

나는 Talend의 etl 도구에서 xpath를 사용하고 있습니다. 나는이 같은 XML을 가지고

<root> 
<employee> 
    <benefits> 
    <benefit> 
     <benefitname>CDE</benefitname> 
     <benefit_start>2/3/2004</benefit_start> 
    </benefit> 
    <benefit> 
    <benefitname>ABC</benefitname> 
    <benefit_start>1/1/2001</benefit_start> 
    </benefit> 
    </benefits> 
<dependent> 
    <benefits> 
    <benefit> 
    <benefitname>ABC</benefitname> 
</benefit> 
</dependent> 

부양 가족에 대한 혜택을 구문 분석, 나는 직원의 이익 요소에 존재하는 요소를 싶어. 위의 예에서 부양 가족의 시작 날짜에 대해 1/1/2001을 얻고 싶습니다. 부양 가족의 급여가 ABC 혜택을 갖기 때문에 2004 년 2 월 3 일이 아니라 1/1/2001이 필요합니다.

/root/employee/dependent/benefits/benefit에 상대적인 xpath는 종속 유익한 이름과 동일한 혜택 이름을 가진 상위 직원 혜택에 대해 benefit_start 값을 산출합니까? (참고로 나는 리터럴 값이 무엇인지 미리 알지 못합니다. 단지 'ABC'를 찾을 수없고, 종속물의 benefitname 요소에있는 값이 무엇이든지 일치해야합니다.

나는 노력하고 있습니다 :

내가 의 중간에 현재 노드의 조상을 참조하는 방법을 모르는

을 ../../../benefits/benefit[benefitname=??what??]/benefit_start xpath (내가 생각하기에 "."라고 생각하기 때문에 직원/혜택의 혜택 노드가됩니다.)

EDIT : 나는 생각합니다. 내가 원하는 것은 "current()/benefitname"입니다. 입니다. 색슨과 함께 일하는 것 같아요, 아직 etl 도구에서 시도하지 않았습니다.

답변

1

XML의 형식이 잘못되었습니다. 사용자의 시술을 잘 설명하지 못했을 것입니다. 시도하는 XPath의 시작 부분에 ../../이 포함되어 있지만 컨텍스트 노드 , 특정 노드, 또는 무엇을 반복하고되어 있는지 여부를 확인합니다.

현재 컨텍스트 노드를 가정 할 않던 employee 요소, 당신은

benefits/benefit[benefitname = ../../dependent/benefits/benefit/benefitname] 
                     /benefit_start 

에 따라 혜택을 일치 benefit_start의를 선택할 수 있다면 현재 컨텍스트 노드에있는 benefit 요소입니다.섹션에서는, 당신은, 당신이 할 수있는 단지 현재 benefit 요소에 대한 대응 benefit_start을 얻으려면 :

당신이 이미 발견 한 생각입니다
../../../benefits/benefit[benefitname = current()/benefitname]/benefit_start 

.

+0

(+1) 좋은 해결책. 그냥 의심 스럽다 :이'current()'는 표준 XPath 함수인가? (또는 XLST 또는 XQuery 또는 기타입니까?) – acdcjunior

+0

@acdcjunior'current()'는 XSLT의 일부입니다. XPath 스펙에는 없는데, 매우 유용하기 때문에 수치 스럽습니다. – JLRishe

+0

그래, 실제로. 설명 주셔서 감사합니다! – acdcjunior

관련 문제