전체 하위 트리에서 일부 요소가 존재할 때 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 식에 대한
왜 요소가 포함되어 있는지 확인하십시오. 비어 있지 않은 시퀀스는 true로 평가됩니다. –
왜냐하면 나는 사람들을 깜짝 놀라게하는 게 좋아하지 않기 때문입니다. 예, 비어있는 노드 목록은 false, 비어있는 노드 목록은 true로 평가되지만,이 xPath를 읽는 사람이 알아야 할 지식의 또 다른 부분입니다. 왜 당신이 정말로 신경 써야 할 조건을 쓰는 것이 무엇을 의미하는지 명백하게 밝히지 마십시오. 다른 사람들이 무슨 일이 일어나고 있는지 쉽게 파악할 수 있습니다. – Matthias
그러면'not (empty (...)) '또는 좀 더 읽기 쉽고 (최적화되지 않은 경우) 훨씬 더 빠르게 사용할 수 있습니다 :'count (...)'는 모든 항목을 계산하고 평가하며 'empty (...)'또는 부울 값으로 평가하는 것은 첫 번째 일치 후에 중지 될 수 있습니다. 어쨌든 : 이것은 항상 사용되는 매우 일반적인 패턴입니다. 모두가'// foo [bar]'를 사용하고 있습니다. 정확히 똑같습니다. –