Xquery hack: SELECT * FROM <tablename>

Xquery hack: SELECT * FROM <tablename>

我正在学习如何进入 xquery 数据库系统。我们正在将 SQL 个数据库转换为 XML。一个非常方便的习语或 hack 知道我到目前为止还没有看到如何快速 运行 等同于通常开始的愚蠢 SQL 查询。给定 table 命名为 "account" 并且知道它的大小合理,告诉数据库 "select * from account;" 看看会发生什么。

使用 XQuery,做到这一点并不容易。有没有人想出这种东西的配方,也许与获得本地名称有关?

相当于 SQL table 中的 SELECT * 的 XQuery 正在转储整个文档。 fn:doc() 是合适的工具。

因此,对于名为 account.xml 的文档,您将 select 整个文档如下所示:

doc('account.xml')

...根据您的实施和配置细节,可能是这样的:

doc('file://path/to/account.xml')

doc('http://yourcompany.com/your-database-namespace-root/account.xml')

(: 这个 'xml flattener' 函数的灵感来自于 'Identity transform' 的例子 https://en.wikipedia.org/wiki/Identity_transform#Using_XQuery :)

declare function local:copyChildElem2attrib ($element as element()) {
  element { node-name($element) }
    { $element/@*,
    for $child in $element/node()
    return if ($child instance of element())
      then
        attribute {  name($child) } { $child }
      else $child
  }
};

let $maxrecords := 150

let $myXtbl :=  doc('account.xml')

for $x at $pos in $myXtbl
where $pos < $maxrecords
return local:copyChildElem2attrib($x)