2012-06-04 5 views
35

아래 예제에서 하위 요소 c가있는 모든 요소 b를 찾도록 도와주십시오. 내가 이름 = "B2"를 가지고 C 요소를 가지고있는 요소를 얻으려면 :XPath 특정 하위 노드가있는 모든 요소를 ​​찾으십시오

<a> 
    <b name = "b1"></b> 
    <b name = "b2"><c/></b> 
    <b name = "b3"></b> 
</a> 

XPath 쿼리 내가이 조건을 결합하려는 두 번째 질문은 인 B2 요소

을 반환해야합니다 그러나이 구문은 작동하지 않을 것 같다 : // B [@ 이름 = 'B2'와 C]

+0

정확히 "작동하지 않는 것"을 의미합니까? 새롭고 별도의 질문을하고 소스 XML 문서 전체, 사용 된 XPath 표현식 및 원하는 결과 및 실제 결과를 제공하십시오. 현재의 XML 문서에서 XPath 표현식'// b [@ name = 'b2'와 c]'는'a'의 두 번째 자식을 정확히 선택합니다. –

답변

43

XML 문서의 구조를 알 때마다 그것의 사용은 큰 비 효율성 (전체 문서 트리의 탐색)을 초래할 수 있으므로, 그것의 // XPath는 의사 운영자을 사용하지 않는 것이 좋습니다.

그러므로, 나는 제공된 XML 문서에 대해이 XPath 식을 recomment :

/*/b[c] 

이 XML 문서의 최상위 요소의 자식 어떤 b 요소를 선택하고 그 c라는 이름의 아이 요소가 . UPDATE

가 : 영업 몇 분 전에 secons의 질문을 :

두 번째 질문 나는 두 조건을 결합 할 수 있습니다 : 내가 요소를 취득하는이 이름 = "B2"와 요소 C를 가지고 있지만이 구문은 작동하지 않을 것 같다 //b[@name='b2' and c]

제공되는 XPath 식 정확하게 일을 선택 않습니다 희망 요소. 여기

는 XSLT 인 - 대조 :

<a> 
    <b name = "b1"></b> 
    <b name = "b2"><c/></b> 
    <b name = "b3"></b> 
</a> 

는 XPath 식을 평가하고 정확하게된다 :이 변환은 제공된 XML 문서에 적용

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*"> 
    <xsl:copy-of select="//b[@name='b2' and c]"/> 
</xsl:template> 
</xsl:stylesheet> 

선택한 요소가 출력으로 복사됩니다.

<b name="b2"> 
    <c/> 
</b> 
+0

나는 요소를 선택하기 위해 파이썬을 사용한다. 내가 사용하는 경우 : root.findall ("b [c]") 결과는 내가 원하는 것임 root.findall ("b [@ name = 'b2'와 c] ") "invalide predicate "오류가 있습니다 파이썬에 대해 다른 질문을 열 수 있습니까? – nam

+0

@HOAINAMNGUYEN : 네, 다른 질문을하는 것이 옳은 것처럼 보입니다. 이것은 파이썬 관련 문제인 것 같습니다. –

+1

@DimitreNovatchev에게 또 다른 xpath 질문에 대한 감사를 전한다. –

19

그것이 있어야로 간단하게

//b[c] 

b은 어디서나 c 아이가 있습니다.

+0

anwser에 감사드립니다! 그것은 작동합니다! – nam

+0

안녕하세요, 이제 2 가지 조건을 결합하고 싶습니다. name = "b2"이고 요소가 c 인 요소를 얻고 싶습니다. 그러나이 구문이 작동하지 않는 것 같습니다 : // b [@ name = 'b2'and c] – nam

+0

나를 위해 일합니다 (Perl에서 xsh 사용). – choroba

관련 문제