2016-03-31 6 views
0

空ノードの検出に関する最も関連性の高いXpathの質問を読んだ後、最初の空でない要素はまだ見つからない。データセットは次のようになります。最初の空でない要素を検出する

<div> 
    <p> 
    <elem>&#xa0;</elem> 
    </p> 
    <p> 
    <elem>&nbsp;</elem> 
    </p> 
    <p> 
    <elem>&#xa0;</elem> 
    </p> 
    <p> 
    <elem>&#xa0;&#xa0;&#xa0;</elem> 
    </p> 
    <p> 
    <elem>Application</elem> 
    </p> 
    <p> 
    <elem>Other text that should not be detected.</elem> 
    </p> 
    <p> 
    <elem>&#xa0;</elem> 
    </p> 
    <p> 
    <elem>Second application</elem> 
    </p> 
</div> 

基本的に空の要素は考慮されるべきではない、と我々は唯一の最初のApplicationの要素を検出します。 normalize-spaceとそれに関連する関数で多くのテストを行っていますが、これを実行することはできません。

主な問題は、空の要素です。どのように我々は、空の要素を無視することができ、そう

/div/p[position() < 3]//*[normalize-space()='Application'] 

:私たちが持っているチェックは今完璧な位置決めを解決するが、HTMLは&nbsp;の要素が含まれていたら、失敗しましたか?これは間に追加のステップを介してのみ可能ですか?

+0

最初は、*空の要素を*持っていないという問題があります。 'normalize-space()'は空白文字を正規化するだけです - ' '要素を正規化するかどうかは分かりませんが(基本的には改行であると仮定します)、空白がないので '  '特殊文字であり、その機能のために空白ではありません。 – BoltClock

答えて

0

私の定義では、空の要素は子ノードを持たないため、//*[not(node()]はその定義ですべての空の要素を選択します。特定のテキストコンテンツを許可する場合は、削除後にnormalize-spaceを確認してください。 //*[not(*) and not(normalize-space(translate(., '&#160;', '')))]。基本的には、normalize-spaceで確認する前に、削除するtranslateコールの2番目の引数としてすべての文字を表示する必要があります。そして私が書いたXPath式はXSLTの内部で動作します。ここで、数値参照はXMLパーサーによって解析されます。通常、XPathを使用して文字をエスケープする方法をホスト言語に依存します。