如果按xml:id进行筛选,document.evaluate中的XPath将返回空



我有这个.xml:

[...]<person xml:id="pe_054">
<persName>
<forename>Robert</forename>
<surname>Thomas</surname>
</persName>
</person>[etc]

我有这个JavaScript:

[...]function resolver() {
return 'http://www.tei-c.org/ns/1.0';
}
Connect.open("GET", "data/persons_places.xml", false);
Connect.setRequestHeader("Content-Type", "text/xml");
Connect.send(null);
var xmldoc = Connect.responseXML;
const surname = xmldoc.evaluate('//tei:person/tei:persName/tei:surname', xmldoc, resolver, XPathResult.STRING_TYPE, null)[...]

它按预期工作,即返回第一个"姓氏"节点的文本内容。不过,我需要通过@xml:id属性获得一个特定的姓氏。因此,如果我将XPath编辑为:

const surname = xmldoc.evaluate('//tei:person[@xml:id='pe_001']/tei:persName/tei:surname', xmldoc, resolver, XPathResult.STRING_TYPE, null)

该代码返回一个空字符串。在控制台日志中,我得到:

XPathResult { resultType: 2, stringValue: "", invalidIteratorState: false }

如果我不按@xml:id进行筛选,stringValue确实会被填充。我不知所措:我试着通过转义@、括号、等号来实现它,什么都不做。有人能帮我吗?

感谢@supputuri,我意识到这只是xml命名空间的问题。因此,工作代码是:

function nsResolver(prefix) {
var ns = {
'xml' : 'http://www.w3.org/XML/1998/namespace',
'tei': 'http://www.tei-c.org/ns/1.0'
};
return ns[prefix] || null;
}
const Connect = new XMLHttpRequest();
Connect.open("GET", "data/persons_places.xml", false);
Connect.setRequestHeader("Content-Type", "text/xml");
Connect.send(null);
var xmldoc = Connect.responseXML;
const surname = xmldoc.evaluate('string(//tei:person[@xml:id="pe_054"]/tei:persName/tei:surname)', xmldoc, nsResolver, XPathResult.STRING_TYPE, null)

最新更新