Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写一个XQuery来测试正在使用的XQuery版本?_Xquery_Saxon_Marklogic_Basex_Exist Db - Fatal编程技术网

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

如何编写一个XQuery来测试正在使用的XQuery版本?,xquery,saxon,marklogic,basex,exist-db,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 /> Ve

我正在编写一个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')" />
版本:

小贩:
供应商URL:

它们对于XQuery的函数类似吗?

在Saxon中似乎没有函数,但eXist具有
系统:get-version()

另外,尽管您没有使用它,但其他SO读者可能有兴趣知道MarkLogic具有
xdmp:xquery-version()


您可以使用XQuery 3.0函数
函数查找
检查是否存在特定于实现的函数,以检查处理器。所有支持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如果由不兼容的版本运行,将无法兼容。你通常不能做一件事
#如果版本>1
新东西 #否则 老东西 #恩迪夫


一些供应商扩展提供版本信息,您可以使用“eval()”类型epress来解决这个问题,但是在纯XQuery中,我想不出哪一点可以用来执行在当前版本上编译时有效但在不同版本上使用某些功能的条件逻辑。

对于Saxon HE来说很棘手,因为Saxon HE只支持XQuery 1.0,不提供供应商扩展。然而,它确实提供了一种机制来创建用户定义的扩展函数,您可以使用它来实现自己设计的查询函数


或者,您可以定义一个外部全局变量,并从运行查询的应用程序初始化该变量,前提是该应用程序在您的控制下。

XQuery规范中没有支持该变量的内容,但可能有特定于实现的函数。您使用的是什么XQuery处理器?我使用的是eXist和一些Saxon HE.XQuery版本“3.0”;让$properties:=('vendor','vendor url','product name','product version','product build')返回{for$properties in$properties return}返回感谢示例代码!这在XQuery 3.0中的任何地方都可以完美地工作。不幸的是,我的一些项目仍然在XQuery 1.0上。Saxon不支持XQuery 3.0:-(我认为这是迁移到XQuery 3.0的一个很好的理由!我添加了针对Saxon的测试,并将其放在这里的要点中:@DanMcCreary我编辑了我的答案,因此它也被保存并可以从中访问。我在Saxon HE中找不到任何可以指示正在运行哪个版本的函数。我确实发现,您可以查找类似于Saxon的特定函数:将函数local:saxon()声明为xs:boolean{try{if(not(空)(函数查找(xs:QName('saxon:parse'),1)))然后true()否则false()}catch*{false()};