2012-05-03 12 views
8

基本的には、ネストされたタグを持つテキストをスクラップする必要があります。与えられたノードのすべてのテキストとそのchldrenのテキストを選択するためのXPath式

このような何か:

<div id='theNode'> 
This is an <span style="color:red">example</span> <b>bolded</b> text 
</div> 

そして私はこれが生成されます表現したい:私は結果なしで時間以上これで苦労してきた

This is an example bolded text 

を。

任意の助けを

+0

私の答えは、現在受け入れられている回答とは異なり、正しいと思うかもしれません。 –

答えて

17

要素ノードのstring-valueを理解される文書順に要素ノードのすべてのテキストノードの子孫の文字列値の連結です。

div要素のXPath string()関数を呼び出すとします。

string(//div[@id='theNode']) 

あなたはまた、ソース文書内の改行やインデントに表示される可能性があります不要な空白を減らすためにnormalize-space機能を使用することができます。これは先頭と末尾の空白を削除し、一連の空白文字を1つの空白で置き換えます。ノードセットをnormalize-space()に渡すと、ノードセットはまず文字列値に変換されます。引数がnormalize-spaceに渡されない場合は、コンテキストノードが使用されます。

normalize-space(//div[@id='theNode']) 

// if theNode was the context node, you could use this instead 
normalize-space() 

あなたは、私が使用している例のXPathよりもコンテキストノードを選択するより効率的な方法を使用したい場合があります。たとえば、次のJavascriptの例をいくつかのブラウザでこのページに対して実行することができます。

var el = document.getElementById('question'); 
var result = document.evaluate('normalize-space()', el, null).stringValue; 

spanb要素間の空白のみのテキストノードが問題かもしれません。

+0

ありがとう、完璧に動作します! –

+0

@MartinTaleski:この回答のXPath式は文字列 '' true ''を評価します。これは本当にあなたが手に入れたいものですか? –

+0

おそらく答えはDimitreのコメントの後に編集されているので、コメントはもう適用されません。 –

0

使用

string(//div[@id='theNode']) 

この式が評価されるとき、結果は文書内の最初の(できればのみ)div要素の文字列値です。

要素の文字列値は、すべてのテキストノードの子孫のドキュメント順の連結としてXPath Specificationに定義されているため、これはまさに必要な文字列です。

これは、すべての空白のテキストノードの数を含めることができますので、あなたが連続した先頭と末尾の空白を排除し、単一の空白文字でどのような中間の空白を置き換えたいことがあります。

使用します

normalize-space(string(//div[@id='theNode'])) 

XSLT - ベースの検証:

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

<xsl:template match="/"> 
    "<xsl:copy-of select="string(//div[@id='theNode'])"/>" 
=========== 
    "<xsl:copy-of select="normalize-space(string(//div[@id='theNode']))"/>" 
</xsl:template> 
</xsl:stylesheet> 

この変換が提供されるXML文書に適用されます。

<div id='theNode'> This is an 
    <span style="color:red">example</span> 
    <b>bolded</b> text 
</div> 

2つのXPath式が評価され、これらの評価の結果を出力にコピーされます。

" This is an 
    example 
    bolded text 
" 
=========== 
    "This is an example bolded text" 
0

方法これについて:

/div/text()[1] |/div/span/text()|/div/b/text()|/div/text()[2]

Hmmss最後の部分についてはわかりません。それで遊ぶ必要があるかもしれません。

関連する問題