형제 노드에 특정 값이있는 경우 XPath를 사용하여 노드를 선택하는 방법은 무엇입니까?


88

다음 문서가 있습니다.

<a>
  <bb>abc</bb>
  <cc>ccc</cc>
  <dd>ddd</dd>
</a>
<a>
  <bb>zz</bb>
  <cc>1</cc>
  <dd>2</dd>
</a>

어떻게 값 얻을 수있는 <cc>경우 XPath를 사용하여 <bb>입니다 zz?


1
문제는 특정 노드에 액세스하는 방법을 알고 있지만 형제가 특정 값을 갖는 경우 노드에 액세스 할 수 없다는 것입니다. 다음과 같을 수 있습니까? / a / cc / contains (/ a / bb = 'zz')?
HOE SENGKIANG

답변:


100

모든 사람이 형제를 쿼리하는 이유를 <bb/>모르면의 술어에서 술어와 일치하는 -elements 를 확인할 수도 <a/>있습니다.

//a[bb/text() = "zz"]/cc/text()

23
"확실하지 왜 모두가 형제 자매를 쿼리한다" : 문제는 형제 자매에 대한했다 아마도 때문에 .. ;-)
hr_117

4
실제로 제목을 읽지 않은 것 같습니다. :) 답변은 어쨌든 유효합니다.
Jens Erat 2013 년

2
귀하의 답변은 형제 자매에 대해서도 질문합니다. *-sibling축을 사용하지 않았습니다 . 그래도 +1.
LarsH

이것은 질문에 대한 대답은 아니지만 내가 잘못 공식화 한 실제 질문에 대한 대답입니다. 감사합니다!
User9213


23

Q : 형제 노드에 특정 값이있는 경우 XPath를 사용하여 노드를 선택하는 방법은 무엇입니까?
다음 형제 및 이전 형제에 대한 "XPath 축"만 있기 때문에 위치가 고정 된 경우 둘 중 하나를 사용할 수 있습니다.

그러나 더 나은 :cc 부모 bb에게 가치있는 자녀가 있는지 찾아보십시오 'zz'.

//cc[../bb='zz']

6
또는 //a[bb = 'zz']/cc.
Tomalak 2013-06-11

'다음 형제 및 이전 형제에 대한 "XPath Axes"만 의미하는 바를 잘 모르겠습니다. 모든 형제 자매에 대해 단일 축이 없다는 사실을 말씀하시는 건가요?
LarsH

@LarsH : 예, 미안합니다. (나쁜 영어 실례합니다 :-()-제가 말하려고했던 것입니다. (질문이 형제 자매를위한 것이기 때문입니다.)
hr_117

6

우선, 귀하의 예제는 올바른 형식의 XML이 아닙니다. 그것을 간과하고 의도를 잘 설명하지 않았다는 것을 (어떤 조건에서 정확히 무엇을 선택하고 싶습니까?) 다음과 같이하고 싶다고 가정합니다.

//cc[preceding-sibling::bb[text()="zz"]]/text()

그것은 선택

TEXT VALUES OF ALL <CC> ELEMENTS
//cc                                    /text()
    THAT HAVE A PRECEDING SIBLING <BB>
    [preceding-sibling::bb             ]
                          THAT HAS TEXT VALUE EQUAL TO "zz"
                          [text()="zz"]

당신은 또한 다음과 같이 쓸 수 있습니다

//bb[text()="zz"]/following-sibling::cc/text()

spec을 보세요. 아주 잘 읽을 수있는 몇 가지 예제 가있어서 많은 것을 배울 것입니다.


1
@LarsH "유효하지 않음"에서 "잘 형성되지 않음"으로 수정 해 주셔서 감사합니다. 나는 오늘 새로운 것을 배웠다.
Petr Janeček 2013 년

4
//a/cc[../bb='zz']/text()

// a : 어디에 있든 모든 'a'요소를 선택합니다.

// a / cc : 'a'요소의 하위 요소 인 'cc'요소를 선택합니다 (a가 어디에 있든 상관 없음).

.. : 현재 노드의 부모를 선택합니다.

[../bb='zz '] : 형제'bb '요소의 값은 zz입니다.

참조 : http://www.w3schools.com/xsl/xpath_syntax.asp


4

이 문제에 대한 또 다른 해결책은

//bb[contains(.,'zz')]/../cc/text()

설명 : 모든 bb포함 된 'zz'모든 자식 노드에 문자열을 bb다음의 부모 노드에가는 것을 bb사용하여 ..우리가 액세스 할 수있는 지금, cc그래서 반환 텍스트를.

설명이 복잡하지 않기를 바랍니다.

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