如何在xquery中验证ContextItem

如何在xquery中验证ContextItem,xquery,saxon,Xquery,Saxon,我的XSLT是原始的,我的XQuery几乎不存在,这应该很简单,所以我不会发布整个示例 我有一个XQuery,我正在通过dotnet saxon9ee api编译和执行它 import schema default element namespace "" at "MessingAbout.xsd"; for $v in (validate { doc("MessingAbout.xml") })/element(SQUARE,FIL

我的XSLT是原始的,我的XQuery几乎不存在,这应该很简单,所以我不会发布整个示例

我有一个XQuery,我正在通过dotnet saxon9ee api编译和执行它

import schema default element namespace "" at "MessingAbout.xsd";

for $v in (validate { doc("MessingAbout.xml") })/element(SQUARE,FILLEDSQUARETYPE)
return <OUTPUT>{$v/@colour}</OUTPUT>
在“messingaout.xsd”处导入架构默认元素命名空间“”;
对于$v in(validate{doc(“messingaout.xml”)})/元素(SQUARE,FILLEDSQUARETYPE)
返回{$v/@color}
这很有效

不过,我想使用“ContextItem”,这样我就可以查询不同的XML,通过将XQueryEvaluator中的ContextItem设置为文档,我已经实现了这一点

import schema default element namespace "" at "MessingAbout.xsd";

for $v in /SQUARE
return <OUTPUT>{$v/@colour}</OUTPUT>
在“messingaout.xsd”处导入架构默认元素命名空间“”;
每平方米五美元
返回{$v/@color}

但是我想验证contextItem,然后使用element(SQUARE,FILLEDSQUARETYPE)之类的东西…但是如何做到这一点呢?

我不太确定您试图做什么,但给出了“messingaout.xsd”:


和“messingaout.xml”:


您的第一个查询生成
,我假设这就是您所期望的。为了在第二个查询中使用上下文项,我将其重写为:

import schema default element namespace "" at "MessingAbout.xsd";

for $v in (validate { . })/element(SQUARE,FILLEDSQUARETYPE)
return <OUTPUT>{$v/@colour}</OUTPUT>
在“messingaout.xsd”处导入架构默认元素命名空间“”;
对于$v in(validate{.})/元素(SQUARE,FILLEDSQUARETYPE)
返回{$v/@color}
并在命令行上传递源文档:
-q:test2.xq-s:messingaout.xml


这给了我与第一个查询相同的结果。我希望这会有所帮助。

除了Martin和Norm建议的方法外,您还可以选择在调用应用程序中进行验证,例如Java或C#。使用设置了验证选项的s9api DocumentBuilder构建文档,然后在运行查询时将生成的类型化XdmNode作为上下文项传递。如果您希望对经过验证的文档执行更多操作,而不仅仅是运行一个查询,那么这种方法更可取。但是,如果您这样做,查询就可以断言它需要一个经过验证的文档,这一点很有用,您可以在查询序言中使用“declare context item”(声明上下文项)。

对于上下文项本身,您可以根据需要使用类型来声明它,例如,
将上下文项声明为文档节点(元素(foo,bar))external。但我不确定您的问题是否与该问题有关,也不确定是否正确使用Saxon API将模式感知XQuery与经过验证的输入文档或某些XQuery语法一起用于验证某些节点。假设您创建了启用验证的ContextItem设置的上下文项,则表达式将仅为$v in/element的
(SQUARE,FILLEDSQUARETYPE)
而不是$v in的
(validate{doc(“messingaout.xml”)})/element(SQUARE,FILLEDSQUARETYPE)
就是这个……我知道我在某处看到了“.”但我正在尝试“doc(.”这显然给了我一个错误,在任何地方都找不到。谢谢,我来看看,这是我一直在努力使用的XQuery语法。
<SQUARE colour="red"/>
import schema default element namespace "" at "MessingAbout.xsd";

for $v in (validate { . })/element(SQUARE,FILLEDSQUARETYPE)
return <OUTPUT>{$v/@colour}</OUTPUT>