跳转至内容

XQuery/所有路径

来自 Wikibooks,开放世界中的开放书籍

您希望生成文档中所有唯一路径表达式的列表。

此过程对于快速熟悉新的数据集非常有用。确保您的文档样式转换访问所有元素也很重要。此过程还可以用作生成新数据集索引文件的基础。

示例输出

[编辑 | 编辑源代码]

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)

以节点作为输入,并返回路径表达式的字符串序列。

参见 xqueryfunctions.com 上的文档

distinct-element-paths 函数

[编辑 | 编辑源代码]
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() 函数

创建 Web 服务

[编辑 | 编辑源代码]

David Elwell 于 2010 年 7 月 22 日在 open-exist 列表中发布了此建议

华夏公益教科书