如何在 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 作为上下文项传递。如果您想对经过验证的文档执行更多操作,而不仅仅是 运行 一个查询,则此方法更可取。但是如果你这样做,查询断言它期待一个经过验证的文档是有用的,你可以在查询序言中使用“声明上下文项”来做到这一点。
我的 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 作为上下文项传递。如果您想对经过验证的文档执行更多操作,而不仅仅是 运行 一个查询,则此方法更可取。但是如果你这样做,查询断言它期待一个经过验证的文档是有用的,你可以在查询序言中使用“声明上下文项”来做到这一点。