[xpath] XPath를 사용하여 특정 속성을 가진 첫 번째 요소를 선택하는 방법

XPath가 bookstore/book[1]에서 첫 번째 책 노드를 선택합니다 bookstore.

더 복잡한 조건과 일치하는 첫 번째 노드를 선택하는 방법 (예 : 일치하는 첫 번째 노드) /bookstore/book[@location='US']



답변

사용하다:

(/bookstore/book[@location='US'])[1]

먼저 location 속성이 ‘US’인 책 요소를 가져옵니다. 그런 다음 해당 세트에서 첫 번째 노드를 선택합니다. 일부 구현에 필요한 괄호 사용에 유의하십시오.

/bookstore/book[1][@location='US']첫 번째 요소에 해당 위치 속성 이없는 경우와 동일하지 않습니다 .


답변

/bookstore/book[@location='US'][1] 간단한 구조에서만 작동합니다.

좀 더 구조를 추가하면 문제가 해결됩니다.

<bookstore>
 <category>
  <book location="US">A1</book>
  <book location="FIN">A2</book>
 </category>
 <category>
  <book location="FIN">B1</book>
  <book location="US">B2</book>
 </category>
</bookstore> 

/bookstore/category/book[@location='US'][1] 수확량

<book location="US">A1</book>
<book location="US">B2</book>

“더 복잡한 조건과 일치하는 첫 번째 노드”가 아닙니다. /bookstore/category/book[@location='US'][2]아무것도 반환하지 않습니다.

괄호를 사용하면 원래 질문의 결과를 얻을 수 있습니다.

(/bookstore/category/book[@location='US'])[1] 준다

<book location="US">A1</book>

그리고 (/bookstore/category/book[@location='US'])[2]작품으로 기대했다.


답변

Jonathan Fingland의 답변에 대한 설명 :

  • 동일한 조건 자 ( [position()=1 and @location='US']) 의 여러 조건 이 전체적으로 사실이어야합니다.
  • 연속적인 술어에 여러 조건 ( [position()=1][@location='US']) 참이어야 속출
  • 이것은 [position()=1][@location='US']! = [@location='US'][position()=1]
    동안 [position()=1 and @location='US']==[@location='US' and position()=1]
  • 힌트 : 고독 [position()=1]은 다음과 같이 축약 될 수 있습니다[1]

당신은 부울 연산자 “와 술어 복잡한 표현을 구축 할 수 있습니다 and“와 ” or“및 부울 XPath 함수와 not(), true()false(). 또한 하위 표현식을 괄호로 묶을 수 있습니다.


답변

보다 복잡한 구조화 된 xml 파일을 고려하여 첫 번째 영어 서적 노드를 찾는 가장 쉬운 방법은 다음과 같습니다.

<bookstore>
 <category>
  <book location="US">A1</book>
  <book location="FIN">A2</book>
 </category>
 <category>
  <book location="FIN">B1</book>
  <book location="US">B2</book>
 </category>
</bookstore> 

xpath 표현식입니다.

/descendant::book[@location='US'][1]


답변

    <bookstore>
     <book location="US">A1</book>
     <category>
      <book location="US">B1</book>
      <book location="FIN">B2</book>
     </category>
     <section>
      <book location="FIN">C1</book>
      <book location="US">C2</book>
     </section>
    </bookstore> 

위의 내용을 감안할 때; 당신은 첫 번째 책을 선택할 수 있습니다

(//book[@location='US'])[1]

그리고 이것은 위치가 미국인 첫 번째 곳을 찾을 것입니다. [A1]

//book[@location='US']

위치가 US 인 모든 책으로 설정된 노드를 반환합니다. [A1, B1, C2]

(//category/book[@location='US'])[1]

문서의 어느 위치 에나있는 첫 번째 책 위치 US를 반환합니다. [B1]

(/bookstore//book[@location='US'])[1]

루트 요소 서점 아래에 위치 US가있는 첫 번째 책을 반환합니다. / bookstore 부분을 실제로 중복으로 만듭니다. [A1]

직접적인 대답으로 :

/bookstore/book[@location='US'][1]

서점 아래에 위치 US가있는 책 요소의 첫 번째 노드를 반환합니다. [A1]

이 예제에서 서점의 직계 자녀가 아닌 최초의 미국 서적을 찾으려면 다음과 같이하십시오.

(/bookstore/*//book[@location='US'])[1]


답변

xpath가 복잡하거나 동일한 xpath가있는 둘 이상의 노드가있는 경우 색인을 사용하여 원하는 노드를 얻으십시오.

예 :

(//bookstore[@location = 'US'])[index]

원하는 노드 수를 지정할 수 있습니다.


답변

주어진 XML에 네임 스페이스가 제공되면 이것을 사용하는 것이 좋습니다.

(/*[local-name() ='bookstore']/*[local-name()='book'][@location='US'])[1]