XPath不返回文档的结果

时间:2013-11-04 23:34:42

标签: javascript xml dom xpath xhtml

我正在尝试此XPath查询,但它返回一个空的枚举。 有人熟悉这个问题吗? 关于加载AJAX的XML的其他XPath查询工作正常。 文档是XHTML1.1 我怀疑是xhtml名称空间(xmlns =“http://www.w3.org/1999/xhtml”)

始终显示0。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<table id="tbl">
<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>4</td><td>5</td><td>6</td></tr>
<tr><td>7</td><td>8</td><td>9</td></tr>
</table>
</body>
<script>
//ORIGINAL: var result = document.evaluate('table#tbl/tr/td[3]/text()', document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
var result = document.evaluate('//body', document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
var node;
var c = 0;
while (node = result.iterateNext()) c++;
alert(c);       // Always 0??? Why?
</script>
</html>

2 个答案:

答案 0 :(得分:3)

如果您的<html>位于命名空间中,则您运行的查询实际上是针对空命名空间运行的。

document.evaluate中的第三个参数指的是namespaceResolver,它根据其名称空间前缀[1]执行它在锡解析命名空间中所说的内容。

现在,你可以拥有一个动态的,也可以创建自己的文件,具体取决于你所消费的文件是你自己的文件还是可以改变。

假设命名空间前缀为空(看起来像是大部分时间),你想用null替换nsResolver,以便[3]:

function nsResolver(prefix) {
  var ns = {
    '' : 'http://www.w3.org/1999/xhtml'
  };
  return ns[prefix] || null;
}

或者,请参阅动态示例,这可能会节省您的长期时间[2]。

参考

  1. https://developer.mozilla.org/en/docs/Introduction_to_using_XPath_in_JavaScript
  2. https://developer.mozilla.org/en/docs/Web/API/document.createNSResolver
  3. https://developer.mozilla.org/en/docs/Introduction_to_using_XPath_in_JavaScript#Implementing_a_User_Defined_Namespace_Resolver

答案 1 :(得分:0)

这是对XHTML的完整修复。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<table id="tbl">
<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>4</td><td>5</td><td>6</td></tr>
<tr><td>7</td><td>8</td><td>9</td></tr>
</table>
</body>
<script>
var f = function(prefix) {alert(prefix);
  var ns = {'h' : 'http://www.w3.org/1999/xhtml'};
  return ns[prefix] || null;
};
var result = document.evaluate('//h:table[@id="tbl"]/h:tr/h:td[3]/text()', document, f, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
var node;
while (node = result.iterateNext()) alert(node.nodeName);
</script>
</html>