XPath в document.evaluate возвращает пустое значение при фильтрации по xml: id - PullRequest
0 голосов
/ 28 марта 2020

У меня есть это. 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)[...]

, которое работает, как и ожидалось, то есть возвращает текстовое содержимое первого Фамильный узел. Однако мне нужно получить указанную фамилию c через атрибут @ xml: id. Поэтому, если я изменяю XPath на это:

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

, код возвращает пустую строку. В console.log я получаю:

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

stringValue действительно заполняется, если я не фильтрую по @ xml: id. Я в недоумении: я пытался заставить его работать, экранируя @, скобки, равно, ничего. Кто-нибудь может мне помочь, пожалуйста?

1 Ответ

0 голосов
/ 29 марта 2020

Благодаря @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)
...