Javascript XPath表达式在evaluator中运行良好,但在浏览器中不起作用
我无法让浏览器的XPath计算器工作,这非常令人沮丧。我很确定这是一个名称空间问题,但我不确定我做错了什么 我有一本书。我想执行一个XPath查询,甚至是一个简单的查询-Javascript XPath表达式在evaluator中运行良好,但在浏览器中不起作用,javascript,xml,xpath,Javascript,Xml,Xpath,我无法让浏览器的XPath计算器工作,这非常令人沮丧。我很确定这是一个名称空间问题,但我不确定我做错了什么 我有一本书。我想执行一个XPath查询,甚至是一个简单的查询-//teiHeader。这是一个有效的查询-返回带有teiHeader标记的所有元素。该文档包含一个这样的元素 解析XML文档后,我尝试对XPath表达式求值,如下所示: const resolver = doc.createNSResolver(doc.documentElement); const xpathResult =
//teiHeader
。这是一个有效的查询-返回带有teiHeader
标记的所有元素。该文档包含一个这样的元素
解析XML文档后,我尝试对XPath表达式求值,如下所示:
const resolver = doc.createNSResolver(doc.documentElement);
const xpathResult = doc.evaluate(xpath, doc, resolver);
let node = xpathResult.iterateNext();
while(node) {
console.log(node);
node = xpathResult.iterateNext();
}
结果是没有节点,对iterateNext
的第一次调用返回null
你可以看看这个问题。您将看到XPath计算没有返回任何元素,但是一个简单的getElementsByTagName
成功。Chrome和Firefox的行为方式相同
这里缺少什么?用作源XML的TEI文档只包含一个没有前缀的默认名称空间。但在XPath1.0中,必须为要使用的每个名称空间指定前缀。XPath
//teiHeader
将只选择没有名称空间的
元素
如果要使用Document.evaluate()
检索teiHeader
元素,可以改用此XPath:
const xpath = "//*[local-name() = 'teiHeader']"
所以基本上,基于web的evaluator是造成我困惑的原因,我认为这是一个有效的XPath。你的XPath是有效的,它在XPath1.0中的含义与XPath2.0中的含义略有不同。这种差异确实很容易被忽视。另见