1

現在、クライアント側のxpath評価に苦労しています。開発目的で、次のように追加しました。

<?php header( 'Content-type: application/xhtml+xml' ); ?> 

無効な(x)htmlを生成した場合に解析エラーを取得するには、ページの上部に移動します。このコードを使用して//div、などのxpathクエリを作成したいと思います。//div[@class='test']

function xpath( query ){
    var evaluater = new XPathEvaluator();
    var resolver = document.createNSResolver( document.documentElement );
    var iterator = evaluater.evaluate( query, document, resolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
    var nodes = [];
    var result;
    while( ( result = iterator.iterateNext() ) != null ){
        nodes.push( result );
    }
    return nodes;
};

私のページの上部は次のようになります。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns='http://www.w3.org/1999/xhtml'>
    <head>
        <meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />

header(...)メソッドがコメントアウトされている場合は正常に機能しますが、トリガーされた場合、xpathクエリは結果を返しません。

どうしてこれなの?xpath評価のヘッダーを果たす役割は何ですか?

編集:

html要素からxmlnsを削除し、header-メソッドを切り替えると、次のように表示されます。

xmlnsなし

4

1 に答える 1

2

(X)HTMLドキュメントがXMLパーサーによって解析される場合(およびコンテンツタイプをapplication / xhtml + xmlに設定すると、ブラウザーまたはユーザーエージェントにXMLパーサーを使用してドキュメントを解析するように要求されます)、XMLルールが適用され、XPathがこのドキュメントで機能しますXMLルールに従います。その場合、のようなすべてのXHTML要素divはXHTML名前空間http://www.w3.org/1999/xhtmlにあり、XPath 1.0式で名前空間の要素を選択するには、たとえば//pf:div、使用するプレフィックス(などpf)をXHTML名前空間にバインドする場所を使用する必要がありますhttp://www.w3.org/1999/xhtml。それをどのように行うかは、使用するXPath APIによって異なります。evaluateたとえば、必要なメソッドとJavascriptAPIの場合です。

document.evaluate('//pf:div', document, function(prefix) { if (prefix === 'pf') return 'http://www.w3.org/1999/xhtml'; else return null; }, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

別の言い方をすれば、現在のパス式は名前空間のないローカル//div名の要素を選択し、XHTMLドキュメントの要素はXHTML名前空間にあるため、パスは要素を選択しません(XML解析ルールが適用される限り)。div

もちろん、最近ではすべてのブラウザベンダーが、text/htmlXMLベースの解析に切り替える代わりにHTML5に移行して使用を継続しているため、ドキュメントをXMLとして提供する必要があるのではないかと思います。

于 2012-09-08T10:10:02.060 に答える