检查XQuery查询的类型

检查XQuery查询的类型,xquery,Xquery,我是一名相当有能力的XSLT1.0开发人员 我正在氧气中试验XQuery 3.0 我有一个氧气的评估,Saxon 9.9.1.7EE,我可以强制一个类型问题 e、 我已经定义了 <xs:element name="vhs" type="xs:string"/> 如果我运行查询,它将失败,并出现某种合理的错误 Cannot compare xs:string to xs:decimal 但是我可以在不运行查询的情况下键入检查查询吗?(通过

我是一名相当有能力的XSLT1.0开发人员

我正在氧气中试验XQuery 3.0

我有一个氧气的评估,Saxon 9.9.1.7EE,我可以强制一个类型问题

e、 我已经定义了

  <xs:element name="vhs" type="xs:string"/>
如果我运行查询,它将失败,并出现某种合理的错误

Cannot compare xs:string to xs:decimal
但是我可以在不运行查询的情况下键入检查查询吗?(通过API或命令行)
我怀疑IDE没有看到类型错误,我必须运行它。

XQuery中的类型系统是强/严格/静态类型和弱/动态类型的混合体。实现在静态和动态方面有很大的自由裁量权。XQuery 1.0将严格静态类型(我称之为“悲观”静态类型)定义为一种选项,但实现它的产品相对较少(SQL Server就是其中之一)。在悲观静态类型下,
$a/b/c
是一个错误,除非您静态地知道$a是一个元素,它总是有一个子元素名为
b
,它总是有一个子元素名为
c
。因此,实现这一点的一个先决条件是您的查询支持模式

Saxon实现了“乐观静态类型”:如果构造保证失败,它只在编译时报告类型错误。例如,
以(12,1)开头。
肯定会失败,因为参数必须是字符串,您可以静态地确定它们不是字符串

如果查询支持模式,那么如果vhs类型为xs:decimal,则允许使用
$x/vhs>14.50
,如果查询类型为xs:string,则不允许使用
$x
,前提是已知
$x
的类型,这取决于您如何声明它。在非模式感知查询中,
$x/vhs>14.50
将根据
vhs
元素中的实际值在运行时成功或失败


利用模式感知可以为您提供更好的编译时错误检测。但遗憾的是,没有多少人这么做,因为这需要在编码时付出额外的努力,而且人们总是相信他们正在编写的代码第一次就能工作。

brilliant,这正是我想要做的,在我的示例中,我确实将vhs声明为字符串,但我只在运行它时出错……我希望在这之前得到它,在某些类型检查或编译阶段,我可以使用经过验证的XSLT,但这似乎需要使用“schema-element()”,这在XQuery中不是必需的?您可能会发现我不久前写的一篇关于模式感知的教程值得一读:如果系统知道路径开头的类型是什么,那么它只会对路径表达式执行有用的类型检查,schema-element()会提供这些信息。我会这样做,我有一个关于Saxons API的更紧迫的问题,我将首先发布这个问题
Cannot compare xs:string to xs:decimal