2012-03-05 2 views
1

문서의 모든 텍스트 노드를 가져오고 싶지만 하이퍼 링크의 일부가 아닌 텍스트 노드 만 가져오고 싶습니다.XPath를 사용하여 하이퍼 링크의 일부가 아닌 텍스트 노드를 얻는 방법

테스트 샘플 :

Hello <a class='foobar' href='foo.html'>foo</a>World Hello foo World 

결과 텍스트 노드 안녕하세요 foo는 세계와 텍스트 노드가 아닌 하이퍼 링크를 포함해야합니다.

시도했지만 "//*[not(@href)]/text()",이 작동하지 않습니다.

(희망)이 설명, 내 문제는 쿼리가 루트 노드 내부 노드 찾고 있던 것을 내 대답은 아래로

UPDATE,하지만 루트 노드 자체를. 내 대답은 아래에있다.

앤드류 (Andrew)는 다른 접근법을 제안했는데, 그 의도는 아마도 더 명확합니다.

답변

3
당신도 (내가 이전에 생각하고 있던 무슨 생각?) 부모를 제외 할 수 있지만, 나중에 배제를 배치해야합니다 (그리고 속기 표기법에서 작동하지 않는 것

이러한 맥락) : 예를 들어

//text()[not(parent::a)] 

:

> cat foo.xml 
<b> 
<a href="href">baz</a> 
text 
<c>foo<a href="href">bar</a>here</c> 
more 
</b> 

> xpath foo.xml "//text()[not(parent::a)]" 
Found 5 nodes: 
-- NODE -- 

-- NODE -- 

text 
-- NODE -- 
foo-- NODE -- 
here-- NODE -- 

more 
+0

우수. XPath 쿼리를 작성하는 방법은 다양합니다. – John

+0

'xpath' 유틸리티에 +1,이 대답까지 존재하지 않았다. 고마워요! –

+0

opensuse의 "werken-xpath"패키지에 있으며 http://sourceforge.net/projects/werken-xpath/에서 오는 것으로 보입니다. 솔직히 말해서 저는 saxon을 사용하지 못했기 때문에 그것을 사용했습니다. 서두를 필요로하고 opensuse는 대안으로 그것을 나열 ... –

2

정상적으로 전구가 터졌습니다. 루트 노드를 포함하여 모든 노드 안에있는 텍스트가 필요했습니다. 정답은 :

//*[not(@href)]/text() | /text() 
1

사용 :

//text()[not(ancestor::a)] 

a 요소 인이 아닌 텍스트 노드를 선택합니다.

관련 문제