命名空间解析器支持 xml 中的默认命名空间以评估 xpath
Namespace resolver supporting default namespace in xml to evaluate xpath
我的 XML 文档开头如下:
<?xml version='1.0' encoding='UTF-8'?>
<article xmlns:d="http://docbook.org/ns/docbook"
xmlns="http://docbook.org/ns/docbook"
version="5.0">
<info>
<title>My title</title>
<annotation>
<segmentedlist>
<segtitle>role</segtitle>
<segtitle>id</segtitle>
<segtitle>description</segtitle>
<seglistitem>
<seg>input</seg>
<seg>hash123</seg>
<seg>INPUT</seg>
</seglistitem>
</segmentedlist>
</annotation>
</info>
<simpara/>
</article>
我需要使用 xpath 查询查找元素,例如:
var inputList = currentDocument.evaluate("//annotation/segmentedlist/seglistitem/seg",
currentDocument,
null,
XPathResult.ANY_TYPE,null);
由于默认命名空间 xmlns="http://docbook.org/ns/docbook" 关联到另一个显式命名空间,命名空间解析器在评估 xpath 表达式时失败。
据我了解 https://developer.mozilla.org/en-US/docs/Web/XPath/Introduction_to_using_XPath_in_JavaScript#implementing_a_default_namespace_resolver 中的说明,没有简单的模式来支持具有此类名称空间声明的“正常 xpath 表达式”。
使用“namespace-uri()=[...]”的建议解决方案似乎使 xpath 表达式复杂化。
有人可以提出模式吗?
将 XPath 3.1 与 Saxon-JS 2 (https://www.saxonica.com/saxon-js/documentation2/index.html) 结合使用:
const xml = `<?xml version='1.0' encoding='UTF-8'?>
<article xmlns:d="http://docbook.org/ns/docbook"
xmlns="http://docbook.org/ns/docbook"
version="5.0">
<info>
<title>My title</title>
<annotation>
<segmentedlist>
<segtitle>role</segtitle>
<segtitle>id</segtitle>
<segtitle>description</segtitle>
<seglistitem>
<seg>input</seg>
<seg>hash123</seg>
<seg>INPUT</seg>
</seglistitem>
</segmentedlist>
</annotation>
</info>
<simpara/>
</article>`;
const xmlDoc = new DOMParser().parseFromString(xml, 'application/xml');
const segElements = SaxonJS.XPath.evaluate('//annotation/segmentedlist/seglistitem/seg', xmlDoc , { 'xpathDefaultNamespace' : 'http://docbook.org/ns/docbook' });
console.log(segElements.length, segElements);
<script src="https://www.saxonica.com/saxon-js/documentation2/SaxonJS/SaxonJS2.rt.js"></script>
我的 XML 文档开头如下:
<?xml version='1.0' encoding='UTF-8'?>
<article xmlns:d="http://docbook.org/ns/docbook"
xmlns="http://docbook.org/ns/docbook"
version="5.0">
<info>
<title>My title</title>
<annotation>
<segmentedlist>
<segtitle>role</segtitle>
<segtitle>id</segtitle>
<segtitle>description</segtitle>
<seglistitem>
<seg>input</seg>
<seg>hash123</seg>
<seg>INPUT</seg>
</seglistitem>
</segmentedlist>
</annotation>
</info>
<simpara/>
</article>
我需要使用 xpath 查询查找元素,例如:
var inputList = currentDocument.evaluate("//annotation/segmentedlist/seglistitem/seg",
currentDocument,
null,
XPathResult.ANY_TYPE,null);
由于默认命名空间 xmlns="http://docbook.org/ns/docbook" 关联到另一个显式命名空间,命名空间解析器在评估 xpath 表达式时失败。
据我了解 https://developer.mozilla.org/en-US/docs/Web/XPath/Introduction_to_using_XPath_in_JavaScript#implementing_a_default_namespace_resolver 中的说明,没有简单的模式来支持具有此类名称空间声明的“正常 xpath 表达式”。 使用“namespace-uri()=[...]”的建议解决方案似乎使 xpath 表达式复杂化。
有人可以提出模式吗?
将 XPath 3.1 与 Saxon-JS 2 (https://www.saxonica.com/saxon-js/documentation2/index.html) 结合使用:
const xml = `<?xml version='1.0' encoding='UTF-8'?>
<article xmlns:d="http://docbook.org/ns/docbook"
xmlns="http://docbook.org/ns/docbook"
version="5.0">
<info>
<title>My title</title>
<annotation>
<segmentedlist>
<segtitle>role</segtitle>
<segtitle>id</segtitle>
<segtitle>description</segtitle>
<seglistitem>
<seg>input</seg>
<seg>hash123</seg>
<seg>INPUT</seg>
</seglistitem>
</segmentedlist>
</annotation>
</info>
<simpara/>
</article>`;
const xmlDoc = new DOMParser().parseFromString(xml, 'application/xml');
const segElements = SaxonJS.XPath.evaluate('//annotation/segmentedlist/seglistitem/seg', xmlDoc , { 'xpathDefaultNamespace' : 'http://docbook.org/ns/docbook' });
console.log(segElements.length, segElements);
<script src="https://www.saxonica.com/saxon-js/documentation2/SaxonJS/SaxonJS2.rt.js"></script>