目前我正在努力进行客户端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
- 方法,则会出现:
答案 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提供。