[xml] 요소의 n 번째 인스턴스를 가져 오기위한 XPath 쿼리

input동일한 고정 id속성을 가진 여러 요소 가있는 HTML 파일 (이 내용은 내가 제어하지 않음)이 있습니다 "search_query". 파일의 내용은 변경 될 수 있지만 항상 inputid 속성을 가진 두 번째 요소 를 얻고 싶다는 것을 알고 "search_query"있습니다.

이를 위해 XPath 표현식이 필요합니다. 시도 //input[@id="search_query"][2]했지만 작동하지 않습니다. 이 쿼리가 실패한 예제 XML 문자열은 다음과 같습니다.

<div>
  <form>
    <input id="search_query" />
   </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

위의 예는 단지 예일 뿐이며 다른 HTML 코드는 상당히 다를 수 있으며 input요소는 일관된 문서 구조없이 어디에서나 나타날 수 있습니다 (단 input, id 속성 이 항상 두 개 이상인 요소 는 항상 보장된다는 점을 제외하고 ) "search_query").

올바른 XPath 표현식은 무엇입니까?



답변

이것은 FAQ입니다 .

//somexpression[$N]

//somexpression해당 노드에서 선택한 모든 노드를 찾으십시오 $N.”

당신이 원하는 것은 :

(//input[@id="search_query"])[2]

알아두기 : []연산자는 //약어 보다 우선 순위가 높습니다 (우선 순위) .


답변

이것은 작동하는 것 같습니다 :

/descendant::input[@id="search_query"][2]

Michael Kay의 “XSLT 2.0 및 XPath 2.0 프로그래머 참조 서, 4 판”에서이 작업을 수행합니다.

XML Path Language 사양 http://www.w3.org/TR/xpath/#path-abbrev 의 “Abbreviated Syntax”섹션에도 힌트가 있습니다.


답변