2012-03-05 4 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' utilの+​​1です。どうもありがとうございました! –

+0

opensuseの "werken-xpath"パッケージに入っていて、http://sourceforge.net/projects/werken-xpath/から来ているようです。正直言って私はsaxonをやってもらえませんでした。急いで望んでいたとopensuseは代わりにそれを記載... –

2

OK、電球が点灯しました。私は、ルートノードを含む任意のノード内にあるテキストが必要でした。正解は次のとおりです。

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

使用

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

これは、a要素の子孫ない任意のテキストノードを選択します。

関連する問題