2012-07-11 2 views
3

이 xpath 식을 공식화하려면 어떻게해야합니까?

<div class="info"> 
    <a href="/s/xyz.html" class="title">title</a> 
    <span class="a">123</span> 
    <span class="b">456</span> 
    <span class="c">789</span> 
</div> 

내가 클래스 "B"로 스팬의 내용을 검색 할 다음 div 요소를 제공. 그러나 구문 분석하고자하는 일부 div는 두 번째 두 기간 (클래스 "b"및 "c")이 부족합니다. 이 div의 경우, 클래스 "a"가있는 범위의 내용을 원합니다. 이것을 선택하는 단일 XPath 표현식을 만들 수 있습니까?

가능하지 않은 경우 div의 전체 내용을 검색하는 선택기를 만들 수 있습니까? 즉 검색한다

<a href="/s/xyz.html" class="title">title</a> 
<span class="a">123</span> 
<span class="b">456</span> 
<span class="c">789</span> 

내가 할 수 있다면, 내가 원하는 데이터를 찾기 위해 정규식을 사용할 수있다. (나는 사업부 내의 텍스트를 선택할 수 있지만 나는 또한 태그 그냥 텍스트 수율 123456789를 선택하는 방법을 잘 모르겠어요.)

답변

1

XPath 식은해야 뭔가 같은 :

//div/span[@class='b'] | //div[not(./span[@class='b'])]/span[@class='a'] 

유니온 연산자 |의 식은 모든 div 내에서 모든 b 클래스 범위를 선택합니다. 오른쪽의 식은 먼저 b 클래스 범위가없는 모든 div를 쿼리 한 다음 해당 a 클래스 범위를 선택합니다. | 연산자는 두 세트의 결과를 결합합니다.

not()와 here이있는 노드를 선택하는 경우 here을 참조하십시오. 운영자.

또한 질문의 두 번째 부분을 참조하려면 here을 참조하십시오. xpath에서 node()를 사용하면 선택한 노드 아래에있는 모든 노드 (노드 + 텍스트)를 선택할 수 있습니다. 따라서 div의 모든 값을 다른 방법으로 처리하기 위해

//div/node() 

으로 처리 할 수 ​​있습니다. UNION 연산자없이 입력에서 작동

+0

감사합니다. 매우 유익합니다. 나는 not (span [@ class = 'b'])'not (./ span [@ class = 'b'])'(이전의 것은 not() 귀하가 제공 한 링크). 둘 사이에 차이점이 있습니까? – jela

+1

마지막으로 xpath를 사용 했으므로 꽤 오래되었습니다. 따라서 링크에서 복사하여 안전한 쪽이되도록했습니다. 나는 그것이 span의 [@ class = 'b']가 div의 직접적인 자식이어야한다는 것을 requirang에서 같아야한다고 생각한다. 반면에 .//를 사용하면 DOM의 div 아래에 스팬 [@ class = 'b']이 생깁니다. 하위의 경우에도 마찬가지입니다. 그러나 확실히 알고 싶으면 w3school 링크의 xpath 매뉴얼을 자세히 살펴보십시오. – inVader

+0

http://www.w3schools.com/xpath/xpath_syntax.asp – inVader

0

표현식 :

//div/span[@class='a' or @class='b'][count(../span[@class='b']) + 1] 

이것은 단지 재미를위한 것입니다. 아마도 프로덕션 코드에서 @ inVader의 대답과 비슷한 것을 사용할 것입니다. -

2

보다 효율적인에는 노동 조합을 필요로하지 않는다 :

이 절대 " // 표현"의 결합입니다 (아래와 같은) 표현식은 일반적으로 두 개의 완전한 문서 트리의 순회 등을 수행

//div/span 
      [@class='b' 
      or 
      @class='a' 
      and 
      not(parent::*[span[@class='b']]) 
      ] 
노조 연산은 문서 순서로 중복 제거 및 정렬을 수행합니다.이 모든 작업은 XPath 프로세서에 지능형 최적화 도구가없는 한 단일 트리 순회보다 덜 효율적입니다.

비효율적 식의 예 :

//div/span[@class='b'] | //div[not(./span[@class='b'])]/span[@class='a'] 

XSLT - 대조 :

이 변환이 제공된 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= 
    "//div/span 
      [@class='b' 
      or 
      @class='a' 
      and 
      not(parent::*[span[@class='b']]) 
      ]"/> 
</xsl:template> 
</xsl:stylesheet> 

<div class="info"> <a href="/s/xyz.html" class="title">title</a> <span class="a">123</span> <span class="b">456</span> <span class="c">789</span> </div> 

XPath 식을 평가하고 (이 경우 단지 하나)에 선택된 요소는 출력 복사되어 동일한 변환이 다른 XML 문서에 적용

<span class="b">456</span> 

거기 같은 XPath 식을 평가하고

<div class="info"> 
    <a href="/s/xyz.html" class="title">title</a> 
    <span class="a">123</span> 
    <span class="x">456</span> 
    <span class="c">789</span> 
</div> 

올바르게 선택된 소자는 출력으로 복사되지 없음 class='b'되고 :

<span class="a">123</span> 
관련 문제