我正在尝试此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>
答案 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 :(得分: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>