1

I am trying this XPath query but it returns an empty enumeration. Is someone familiar with this problem? Other XPath queries on AJAX loaded XMLs work fine. document is XHTML1.1 I am suspecting xhtml namespace (xmlns="http://www.w3.org/1999/xhtml")

Always display 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>
4

2 回答 2

3

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

in 中的第三个参数document.evaluate指的是 a namespaceResolver,它按照它在 tin 上所说的执行 - 根据名称空间前缀 [1] 解析名称空间。

现在,您可以拥有一个动态的,也可以创建自己的,这取决于您使用的文档是您自己的还是可以更改的。

假设命名空间前缀是空的(看起来像,因为它是大多数时间),你想nullnsResolver这样的 [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
于 2013-11-04T23:45:23.057 回答
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>
于 2013-11-05T17:50:18.347 回答