跳转到内容

XQuery/所有叶路径

来自维基教科书,开放书籍,开放世界

您希望生成文档或文档集合中所有叶路径的列表。

此过程对于了解新数据集非常有用。具体来说,您会发现 XML 文件中的叶元素承载了数据样式标记中的大部分数据。这些叶元素通常用于承载文档中的大多数语义或意义。它们为文档的语义清单奠定了基础。也就是说,每个叶元素都应该能够与数据定义相关联。

叶元素也是索引配置文件中索引的良好目标。

我们将使用 functx leaf-elements() 函数

  functx:leaf-elements($nodes*) xs:string*

此函数将一个或多个节点作为输入,并返回一个字符串数组。

示例输出

[编辑 | 编辑源代码]

对于包含在 eXist 演示集中的演示剧哈姆雷特,文件 /db/shakespeare/plays/hamlet.xml 将生成以下输出

PLAY
TITLE
FM
P
PERSONAE
PERSONA
PGROUP
GRPDESCR
SCNDESCR
PLAYSUBT
ACT
SCENE
STAGEDIR
SPEECH
SPEAKER
LINE

叶元素的源代码

[编辑 | 编辑源代码]
declare namespace functx = "http://www.functx.com"; 
declare function functx:leaf-elements ($root as node()?) as element()* {
   $root/descendant-or-self::*[not(*)]
};

此查询使用 descendant-or-self::* 函数,并使用谓词 [not(*)] 来限定没有子节点的元素。

示例 XQuery

[编辑 | 编辑源代码]
xquery version "1.0";
declare namespace functx = "http://www.functx.com";
declare function functx:distinct-element-names($nodes as node()*) as xs:string* {
   distinct-values($nodes/descendant-or-self::*/local-name(.))
};

let $doc := doc('/db/shakespeare/plays/hamlet.xml')

let $distinct-element-names := functx:distinct-element-names($doc)

let $distinct-element-names-count := count($distinct-element-names)

return
<ol>{
  for $distinct-element-name in $distinct-element-names
  order by $distinct-element-name
  return
      <li>{$distinct-element-name}</li>
}</ol>

添加属性

[编辑 | 编辑源代码]

您还可以运行一个查询来获取所有不同的属性。属性都被视为叶数据类型,因为它们永远不能有子元素。

declare function functx:distinct-attribute-names($nodes as node()*)  as xs:string* {
   distinct-values($nodes//@*/name(.))
};

此查询实际上表示“获取输入节点中的所有不同属性名称”。

对于 MODS 演示文件:doc('/db/mods/01c73f2b05650de2e6124d9d113f40be.xml')

您将获得以下属性

  1. type
  2. encoding
  3. authority

</syntaxhighlight>

参考文献

[编辑 | 编辑源代码]

文档 在 xqueryfunctions.com 网站上。

华夏公益教科书