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


176

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

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

1
왜 모든 사람이 "prop"속성을보고 있습니까? 내가 뭐 놓친 거 없니? 그것은 단지 첫 세 노드를 얻는다고 말합니다.

6
그것이 요구 된 것이기 때문에 모든 사람들이 prop 속성을보고 있습니다. prop에 "Foo"가 포함 된 모든 노드를 가져옵니다. <a prop="Foo5" />를 추가하면 왜 "처음 세 개의 노드"가 아닌지 알 수 있습니다 ..
erlando

제목에 관계없이 본문의 질문은 잘못 표현됩니다. foo가 실제로 prop 속성에있을 수 있습니까, 아니면 처음 세 개의 노드 만 심각하게 원하십니까?

3
예, 제목을 참조하십시오 (그리고 자유롭게 편집하십시오).
ripper234

답변:


307
//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')]  

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


3
xmlme.com이제 다른 호스트로 리디렉션되고 도구 또는 이와 유사한 것을 호스팅하지 않는 것으로 보입니다.
jpmc26

26

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

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

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

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

2
모든 노드//@*[contains(., 'Foo')]
aliopi

16
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 개를 선택할 수 있습니다.


6

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

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

4

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

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

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


@toddk ... 존재하지 않는 속성 인 @foo를 타겟팅했습니다. 당신은 ;-) @prop 대상 싶어
지하철 스머프에게

4

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

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



1

위 코드의 경우 // * [contains (@ prop, 'foo')]


이에 foo에있는 모든 요소에 대해,하지만 속성이 있어야합니다 "소품"
digiguru

1

이 시도:

// a [포함 (@ prop, 'foo')]

문서의 "a"태그에서 작동해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.