跳转到内容

XQuery/使用 XQuery 函数

来自维基教科书,一个开放的书籍项目

您想使用现有的 XQuery 函数。您需要能够理解函数的工作原理以及它们是如何记录的。

XQuery 1.0 规范包含许多用于处理字符串、URI 和其他数据的内置函数。要使用内置函数,您需要知道它的输入及其数据类型以及它创建的输出形式。

理解 XQuery 参数和返回值类型

[编辑 | 编辑源代码]

XQuery 是一种强类型语言,因此函数通常经过精心设计以使用一组受限的数据类型。当您使用参数将数据传递给函数时,您必须指定其类型,使用元素、节点、项目、序列或任何 XML 模式数据类型的组合。除了数据类型之外,还使用后缀称为出现指示符,例如“+”、“?”或“*”,紧跟在数据类型之后,以指示参数是否可选或可以具有多个值。以下是三种出现指示符及其含义

  • ? 匹配零个或一个项目
  • * 匹配零个或多个项目
  • + 匹配一个或多个项目

应注意理解单个序列作为参数与重复的一组项目之间的区别。

XQuery 语言大约有 111 个内置函数,但许多人发现 10% 的 XQuery 函数被使用了 90% 的时间。以下是一些最常用的函数

 string-length($string as xs:string) as xs:integer - returns the length of a string as the number of its characters

示例:string-length("Hello") 返回 5,因为字符串 "Hello" 长度为五个字符。

 concat($input as xs:anyAtomicType?) as xs:string - concatenates a list of strings together.

该函数不接受一组值,只接受作为单独参数传递的单个原子值。

示例:concat('big', 'red', 'ball') 返回 "bigredball"

 string-join($sequence as xs:string*, $delimiter as xs:string) as xs:string - combines the items in a sequence, separating them with a delimiter

示例:string-join(('big', 'red', 'ball'), '-') 返回 "big-red-ball"

请注意,string-join 的第一个参数是单个项目序列,而 concat 的参数是零个或多个字符串。

示例数据类型

[编辑 | 编辑源代码]
  • xs:date 指的是名为 xs:date 的内置原子模式类型
  • attribute()? 指的是可选的属性节点
  • element() 指的是任何元素节点
  • element(po:shipto, po:address) 指的是具有名称 po:shipto 且具有类型注释 po:address(或从 po:address 派生的模式类型)的元素节点
  • element(*, po:address) 指的是任何名称的元素节点,其类型注释为 po:address(或从 po:address 派生的类型)
  • element(customer) 指的是名为 customer 的元素节点,其类型注释可以是任何
  • schema-element(customer) 指的是名称为 customer(或在由 customer 领导的替换组中)的元素节点,其类型注释与作用域内元素声明中为 customer 元素声明的模式类型匹配
  • node()* 指的是零个或多个任意类型的节点的序列
  • item()+ 指的是一个或多个节点或原子值的序列

返回结果

[编辑 | 编辑源代码]

您编写的每个 XQuery 函数都会返回一个结果。

在以下示例中,输入是 0 到多个节点的序列,输出是 0 到多个节点的序列

(: input 0 to many nodes and return 0 to many nodes :)
declare function local:myFunction($input as node()*) as node()* {

在以下示例中,输入是单个必需节点,输出是单个必需节点。

(: input a single required nodes and return a single required node :)
declare function local:myFunction($input as node()) as node() {

在以下示例中,输入是单个可选节点,输出是单个可选节点。

(: input a single optional nodes and return a single optional node :)
declare function local:myFunction($input as node()?) as node()? {

有用参考

[编辑 | 编辑源代码]

有关 eXist 中所有可用函数(包括 XQuery 中未定义的函数)的权威文档,请参阅 eXist XQuery 函数文档

有关如何指定序列类型的详细信息,请参阅 XQuery 序列类型

有关标准 XQuery 和 XPath 函数库,您还可以参考 XQuery 1.0 和 XPath 2.0 函数和运算符

另请参阅著名 XQuery 专家 Pricilla Walmsley 在 FunctX XQuery 函数库 中的函数详细文档和示例

华夏公益教科书