如何在XQuery中验证ContextItem

问题描述

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...