如果按 xml:id 过滤,document.evaluate returns 中的 XPath 为空

XPath within document.evaluate returns empty if filtering by xml:id

我有这个。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)[...]

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

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

代码 returns 一个空字符串。在 console.log 我得到:

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)