为什么xpath查询不会在xhtml页面上返回结果

时间:2012-09-08 09:09:47

标签: javascript xpath content-type

目前我正在努力进行客户端xpath评估。为了发展目的,我补充说:

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

到我的页面顶部,如果我生成无效的(x)html,则会出现解析错误。我想使用此代码制作一些xpath查询,例如//div//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 - 方法,则会出现:

without xmlns

1 个答案:

答案 0 :(得分:2)

如果您的(X)HTML文档由XML解析器解析(并将内容类型设置为application / xhtml + xml,要求浏览器或用户代理使用XML解析器解析文档),则应用XML规则并且XPath正常工作根据XML规则在此文档上。在这种情况下,所有XHTML元素(如div)都位于XHTML名称空间http://www.w3.org/1999/xhtml中,而XPath 1.0表达式则选择您需要使用的名称空间中的元素,例如{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提供。