问题描述
我的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>
效果很好。
尽管我想使用“ 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作为上下文项传递。如果您要对经过验证的文档做更多的事情而不是仅运行一个查询,则最好采用这种方法。但是,如果采用这种方式,则对查询断言它正在等待一个经过验证的文档很有用,您可以在查询序言中使用“声明上下文项”来完成此操作。