2013-12-09 1 views
1

전체 하위 트리에서 일부 요소가 존재할 때 XPATH 표현식을 사용하여 하나의 요소를 필터링하려는 경우 xpath 표현식이 모든 결과와 일치하도록 할 수 있는지 궁금합니다. 그것은 일치하는 첫 번째 요소 인 경우, 다음 표현식은 true로 평가완전한 하위 트리 존재 여부 확인

xpath::evaluate(" //CuorS/Cd[ starts-with(./*/@Name], 'Dog')]") 
<CuorS> 
    <Cd> 
    <Ani Name="CatOne" /> 
    <Bodi Name="Fish" /> 
    </Cd> 
    <Cd> 
    <Ani Name="DogOne" /> 
    <Bodi Name="Fish" /> 
    </Cd> 
    <Cd> 
    <Ani Name="Owl" /> 
    <Bodi Name="DogTwo" /> 
    </Cd> 
</CuorS> 

을 (Cd[2]가 일치하지만 Cd[3] 것) 나는대로 표현을 공식화 수있어

xpath::evaluate("//CuorS/Cd/*[ starts-with(./@Name], 'Dog')]/..") 

모두 일치하지만 존재를 일치시키는 필터 표현식을 찾고 있습니다 : '해당 하위 트리에 일치하는 요소가 하나있는 경우'. 하나의 결과가 아닌 일련의 결과에 대한 기능을 평가할 수 있습니까?

감사합니다. 어떻게 그 XPath 식에 대한

답변

1

는 :

//CuorS/Cd[ count(./*[starts-with(@Name, 'Dog')]) >= 1] 

이것은 단지 (는 "개"로 시작하는) 일치하는 하위 노드를 계산합니다. 따라서이 조건과 일치하는 하위 노드가 하나 이상있는 모든 Cd와 일치합니다.

당신이 조건 블록을 중첩 할 때 쉽게 알 수 있습니다. 그것들을 중첩시킴으로써 당신이 요구하는 것처럼 노드의 시퀀스에 대한이 평가를 할 수 있습니다 (당신이 거기에서 성취하려는 것을 완전히 이해하지 못함).

xpath::evaluate("//CuorS/Cd[*[starts-with(./@Name]], 'Dog')]") 

이 하위 요소와이 CuorS의 모든 카드뮴 아이들 일치합니다 :

<Cd> 
    <Ani Name="DogOne"/> 
    <Bodi Name="Fish"/> 
    </Cd> 
    <Cd> 
    <Ani Name="Owl"/> 
    <Bodi Name="DogTwo"/> 
    </Cd> 
+0

왜 요소가 포함되어 있는지 확인하십시오. 비어 있지 않은 시퀀스는 true로 평가됩니다. –

+0

왜냐하면 나는 사람들을 깜짝 놀라게하는 게 좋아하지 않기 때문입니다. 예, 비어있는 노드 목록은 false, 비어있는 노드 목록은 true로 평가되지만,이 xPath를 읽는 사람이 알아야 할 지식의 또 다른 부분입니다. 왜 당신이 정말로 신경 써야 할 조건을 쓰는 것이 무엇을 의미하는지 명백하게 밝히지 마십시오. 다른 사람들이 무슨 일이 일어나고 있는지 쉽게 파악할 수 있습니다. – Matthias

+0

그러면'not (empty (...)) '또는 좀 더 읽기 쉽고 (최적화되지 않은 경우) 훨씬 더 빠르게 사용할 수 있습니다 :'count (...)'는 모든 항목을 계산하고 평가하며 'empty (...)'또는 부울 값으로 평가하는 것은 첫 번째 일치 후에 중지 될 수 있습니다. 어쨌든 : 이것은 항상 사용되는 매우 일반적인 패턴입니다. 모두가'// foo [bar]'를 사용하고 있습니다. 정확히 똑같습니다. –

1

그냥 술어를 이동 : 여기

은 XPATH의 출력 (주어진 샘플 입력)입니다 개로 시작하는 이름. 결과 시퀀스가 ​​비어

xpath::evaluate("boolean(//CuorS/Cd[*[starts-with(./@Name]], 'Dog')])") 

경우 것 적어도 하나 개의 요소가있는 경우,이 거짓 얻을 것입니다 : 당신이 사용하고있는 XPath는 프로세서와 프로그래밍 언어에 따라, 당신도 부울 값으로 평가할 수있다 true를 반환합니다.