xquery - 我如何编写一个 XQuery 来测试正在使用的 XQuery 版本?

标签 xquery saxon marklogic basex exist-db

我正在编写一个 XQuery,它需要检查正在运行的 XQuery 版本(eXist、Saxon 等)。是否有一个标准函数可以返回 XQuery 的系统属性,例如版本、供应商等?

我知道有一些系统特定的调用,比如 eXist 的

system:get-version()

但我正试图找到一个可以在所有平台上运行的标准函数。

例如在XSLT中我们有:

Version:
<xsl:value-of select="system-property('xsl:version')" />
<br />
Vendor:
<xsl:value-of select="system-property('xsl:vendor')" />
<br />
Vendor URL:
<xsl:value-of select="system-property('xsl:vendor-url')" />

它们对XQuery的功能是否相似?

最佳答案

您可以使用 XQuery 3.0 函数 function-lookup 检查特定于实现的函数是否存在,以检查处理器。所有支持 XQuery 3.0 的处理器都应该能够处理这个。

declare function local:exist() as xs:boolean {
  try {
    if (not(empty(function-lookup(xs:QName('system:get-version'), 0))))
    then true()
    else false()
  } catch * {
    false()
  }
};

(: works only on Saxon PE and EE, fails in HE since HE does not support XQuery 3.0. It would be nice if saxon had a version function. :)
declare function local:saxon() as xs:boolean {
  try {
    if (not(empty(function-lookup(xs:QName('saxon:parse'), 1))))
    then true()
    else false()
  } catch * {
    false()
  }
};

declare function local:marklogic() as xs:boolean {
  try {
    if (not(empty(function-lookup(xs:QName('xdmp:xquery-version'), 0))))
    then true()
    else false()
  } catch * {
    false()
  }
};

declare function local:basex() as xs:boolean {
  try {
    if (not(empty(function-lookup(xs:QName('prof:time'), 1))))
    then true()
    else false()
  } catch * {
    false()
  }
};

declare function local:get-processor() as xs:string {
  if (local:exist()) then "eXist"
  else if (local:saxon()) then "Saxon"
  else if (local:marklogic()) then "MarkLogic"
  else if (local:basex()) then "BaseX"
  else "Unknown"
};

local:get-processor()

不幸的是,我无法使用高阶函数使它更优雅,因为特定于实现的函数是在实际调用函数之前执行的。但我相信这也可以写得更优雅。

关于xquery - 我如何编写一个 XQuery 来测试正在使用的 XQuery 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20849295/

相关文章:

types - XQuery:为什么 "() = ()"和 "() eq ()"都计算为 false?

xpath - 基于标记化字符串的多个contains()

java - 如何在 Java 中使用 Saxon XPath 2.0?

marklogic - 索引 JSON 日期

java - 使用嵌套循环并返回多个值来解析 XML

XPath/XQuery : find text in a node, 但忽略特定后代元素的内容

java - 无法将 net.sf.saxon.jaxp.TemplatesImpl 转换为可序列化

saxon - XQuery : best way to convert node sequence to array

javascript - MarkLogic 8 和服务器端 JavaScript - 调试支持

node.js - Marklogic 8 Node.js API - 短语搜索