XQuery/所有路径
外观
< XQuery
您希望生成文档中所有唯一路径表达式的列表。
此过程对于快速熟悉新的数据集非常有用。确保您的文档样式转换访问所有元素也很重要。此过程还可以用作生成新数据集索引文件的基础。
eXist 演示系统上莎士比亚演示文稿中的示例文件/db/shakespeare/plays/hamlet.xml的唯一路径列表将生成以下结果。
PLAY
PLAY/TITLE
PLAY/FM
PLAY/FM/P
PLAY/PERSONAE
PLAY/PERSONAE/TITLE
PLAY/PERSONAE/PERSONA
PLAY/PERSONAE/PGROUP
PLAY/PERSONAE/PGROUP/PERSONA
PLAY/PERSONAE/PGROUP/GRPDESCR
PLAY/SCNDESCR
PLAY/PLAYSUBT
PLAY/ACT
PLAY/ACT/TITLE
PLAY/ACT/SCENE
PLAY/ACT/SCENE/TITLE
PLAY/ACT/SCENE/STAGEDIR
PLAY/ACT/SCENE/SPEECH
PLAY/ACT/SCENE/SPEECH/SPEAKER
PLAY/ACT/SCENE/SPEECH/LINE
PLAY/ACT/SCENE/SPEECH/STAGEDIR
PLAY/ACT/SCENE/SPEECH/LINE/STAGEDIR
请注意,这些路径表达式按文档顺序排序,即路径首次出现在文档中的顺序。因此,您可以看到 PERSONAE 中的演员表在 ACT/SCENE 元素之前出现。输出也可以按字母顺序排序。
我们将使用 functx 库。
特别是函数
functx:distinct-element-paths($nodes)
以节点作为输入,并返回路径表达式的字符串序列。
xquery version "1.0";
declare namespace functx = "http://www.functx.com";
declare function functx:path-to-node($nodes as node()*) as xs:string* {
$nodes/string-join(ancestor-or-self::*/name(.), '/')
};
declare function functx:distinct-element-paths($nodes as node()*) as xs:string* {
distinct-values(functx:path-to-node($nodes/descendant-or-self::*))
};
declare function functx:sort($seq as item()*) as item()* {
for $item in $seq
order by $item
return $item
};
let $in-xml := collection("NAMEOFCOLLECTION")
return functx:sort(functx:distinct-element-paths($in-xml))
此查询的核心是单个表达式
ancestor-or-self::*/name(.)
它实际上表示“获取文档中所有节点的元素名称”。下一步是将此列表转换为唯一元素路径的列表。这是通过函数functx:distinct-element-paths()完成的。
使用 document()
使用 collection() 函数
David Elwell 于 2010 年 7 月 22 日在 open-exist 列表中发布了此建议