3

実行中のXQueryのバージョン(eXist、Saxon など)を確認する必要があるXQueryを作成しています。バージョン、ベンダーなどの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 の同様の機能はありますか?

4

4 に答える 4

2

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()

残念ながら、関数が実際に呼び出される前に実装固有の関数が実行されたため、高階関数を使用してこれをよりエレガントにすることはできませんでした。しかし、これはもっとエレガントに書くこともできると確信しています。

于 2013-12-31T11:46:05.637 に答える
0

ここには、互換性のないバージョンで実行された場合、異なるバージョンの xquery が単にコンパイルされないという固有の問題があります。通常、
#if バージョン > 1
新しいもの #else 古いもの #endifはできません

一部のベンダー拡張機能はバージョン情報を提供し、「eval()」タイプの表現を使用してこれを回避できますが、純粋な XQuery では、現在のコンパイル時間である条件付きロジックを実行するために使用できると考えることができるポイントはありません。バージョンはまだ別のバージョンでいくつかの機能を使用しています。

于 2013-12-31T20:51:11.930 に答える