如何在 xquery 中验证 ContextItem

How to validate the ContextItem in xquery

我的 XSLT 很原始,我的 XQuery 几乎不存在,这应该是微不足道的,所以我不会 post 整个示例。

我有一个 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>

效果很好。

不过我想使用“ContextItem”,这样我就可以查询不同的 XMLS,并且我已经通过将 XQueryEvaluator 中的 ContextItem 设置为文档来实现它。

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

for $v in /SQUARE
return <OUTPUT>{$v/@colour}</OUTPUT>

但我想验证 contextItem,然后使用它来使用 element(SQUARE,FILLEDSQUARETYPE) 之类的东西......但是你是怎么做到的?

我不太确定您要做什么,但给出“MessingAbout.xsd”:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">
  <xs:complexType name="FILLEDSQUARETYPE">
    <xs:attribute name="colour" type="xs:string"/>
  </xs:complexType>

  <xs:element name="SQUARE" type="FILLEDSQUARETYPE"/>
</xs:schema>

和“MessingAbout.xml”:

<SQUARE colour="red"/>

您的第一个查询生成 <OUTPUT colour="red"/>,我认为这是您所期望的。为了在第二个查询中使用上下文项,我将其重写为:

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

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

并在命令行传递源文件:-q:test2.xq -s:MessingAbout.xml.

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

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