1

目前我正在努力进行客户端 xpath 评估。出于开发目的,我添加了:

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

如果我生成无效的 (x)html,请转到我的页面顶部以获取解析错误。我想使用以下代码进行一些 xpath 查询,例如//div, or等​​等://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你需要的方法和 Javascript API 的情况下,例如

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中具有本地名称div的元素,并且由于 XHTML 文档中的元素位于 XHTML 名称空间中,因此路径不会选择任何元素(只要 XML 解析规则适用)。

当然,现在所有浏览器供应商都转向 HTML5 以继续使用text/html,而不是切换到基于 XML 的解析,我想知道您为什么要将文档作为 XML 提供。

于 2012-09-08T10:10:02.060 回答