[xml] “foo”를 포함하는 속성을 선택하기위한 올바른 XPath는 무엇입니까?

이 XML이 주어지면 XPath는 prop속성에 포함 된 모든 요소 Foo(처음 세 개의 노드)를 반환합니다 .

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>



답변

//a[contains(@prop,'Foo')]

이 XML을 사용하여 결과를 다시 얻는 경우 작동합니다.

<bla>
 <a prop="Foo1">a</a>
 <a prop="Foo2">b</a>
 <a prop="3Foo">c</a>
 <a prop="Bar">a</a>
</bla>

편집 : 주목해야 할 또 다른 사항은 위의 XPath가 해당 특정 XML에 대한 정답을 반환하지만 “bla”요소의 “a”요소 만 얻으려면 다른 사용자도 언급했듯이

/bla/a[contains(@prop,'Foo')]

이것은 “blah”요소에 내포되어 있는지에 관계없이 전체 xml 문서에서 모든 “a”요소를 검색합니다.

//a[contains(@prop,'Foo')]  

나는 철저하고 스택 오버 플로우 정신을 위해 이것을 추가했습니다. 🙂


답변

이 XPath는 노드 이름 또는 속성 이름에 관계없이 ‘Foo’를 포함하는 속성을 가진 모든 노드를 제공합니다.

//attribute::*[contains(., 'Foo')]/..

물론, 속성 자체의 내용에 더 관심이 있고 반드시 부모 노드 일 필요는 없다면 /.를 삭제하십시오.

//attribute::*[contains(., 'Foo')]


답변

descendant-or-self::*[contains(@prop,'Foo')]

또는:

/bla/a[contains(@prop,'Foo')]

또는:

/bla/a[position() <= 3]

해부 :

descendant-or-self::

축-아래의 모든 노드와 노드 자체를 검색합니다. //보다 이것을 말하는 것이 더 낫습니다. // 어디에서나 (루트 노드의 자손 또는 자손) 의미하는 구현이 있습니다. 다른 하나는 기본 축을 사용합니다.

* or /bla/a

태그-와일드 카드 일치 및 / bla / a는 절대 경로입니다.

[contains(@prop,'Foo')] or [position() <= 3]

[] 내의 조건입니다. attribute는 다른 검색 축이므로 @prop는 attribute :: prop의 약자입니다. 또는 position () 함수를 사용하여 처음 3 개를 선택할 수 있습니다.


답변

John C가 가장 비슷하지만 XPath는 대소 문자를 구분하므로 올바른 XPath는 다음과 같습니다.

/bla/a[contains(@prop, 'Foo')]


답변

다음과 같은 것을 시도해 보셨습니까?

// a [포함 (@prop, “Foo”)]

전에는 contains 함수를 사용한 적이 없지만 광고 된대로 작동해야한다고 생각합니다 …


답변

링크 자체의 내용과도 일치해야하는 경우 text ()를 사용하십시오.

//a[contains(@href,"/some_link")][text()="Click here"]


답변

/ bla / a [포함 (@prop, “foo”)]