【问题标题】:Why do xpath querys do not return a result on xhtml pages为什么 xpath 查询不会在 xhtml 页面上返回结果
【发布时间】:2012-09-08 09:09:46
【问题描述】:

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

【问题讨论】:

  • 可以贴出原版的html吗?
  • 恕我直言,因为从命名空间xmlns='http://www.w3.org/1999/xhtml',可以推断返回数据的内容类型,这就是为什么不需要显式设置内容类型的原因。此外,元标记为内容类型添加相应的响应标头。

标签: javascript xpath content-type


【解决方案1】:

如果您的 (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);

换一种方式来解释,您当前的路径表达式 //divno namespace 中选择本地名称为 div 的元素,并且由于 XHTML 文档中的元素位于该路径的 XHTML 命名空间中不选择任何元素(只要 XML 解析规则适用)。

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

【讨论】:

  • 谢谢!这听起来不错!我会在几个小时内试一试!
  • 非常酷!你的解释很好!我现在要尝试更多!谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-09-28
  • 2020-09-24
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
相关资源
最近更新 更多