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

다음 문서가 있습니다.

<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?



답변

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

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


답변

필요한 것은 following-siblingXPath 축입니다.

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

여기에서 Xpath를 테스트하십시오. http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625


답변

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

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

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


답변

우선, 귀하의 예제는 올바른 형식의 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을 보세요. 아주 잘 읽을 수있는 몇 가지 예제 가있어서 많은 것을 배울 것입니다.


답변

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

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

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

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

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

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


답변

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

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

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

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


답변