如果按 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)
我有这个。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)