我正在为我们的xml输入/输出设置Schema,并且遇到了XMLSpy验证正常但Xerces在xs:asserts之一上失败的问题。 我正在使用最新的xerces xerces-2_12_0-xml-schema-1.1。
我已经包含了该发行版中的所有.jar文件(xercesSamples.jar除外)
测试代码为:
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/XML/XMLSchema/v1.1");
factory.setFeature("http://apache.org/xml/features/validation/cta-full-xpath-checking", true);
Schema schema = factory.newSchema(new File("C:/Imports/Test.xsd"));
validator = schema.newValidator();
validator.validate(new StreamSource("C:/Imports/Test.xml"));
我已将xsd文件修剪为:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:lit="http://www.w3schools.com" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" targetNamespace="http://www.w3schools.com" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1">
<xs:element name="MetrixXML">
<xs:complexType>
<xs:all>
<xs:element ref="lit:Page" minOccurs="1" maxOccurs="unbounded"/>
</xs:all>
<xs:attribute name="SchemaVersion" type="xs:float" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Page">
<xs:complexType>
<xs:attribute name="ContentPositionRule" type="xs:string"/>
<xs:attribute name="FilePageNum" type="xs:nonNegativeInteger"/>
<xs:assert test="(//@SchemaVersion ge 2.1) or ((//@SchemaVersion lt 2.1) and not (@ContentPositionRule))"/>
</xs:complexType>
</xs:element>
</xs:schema>
该xml是:
<?xml version="1.0" encoding="UTF-8"?>
<MetrixXML xmlns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com Test.xsd" SchemaVersion="2.1" >
<Page FilePageNum="1"/>
<Page ContentPositionRule="CenterEachPage"/>
</MetrixXML>
我得到的错误是:
org.xml.sax.SAXParseException:cvc-assertion:元素'Page的断言评估('(// @ SchemaVersion ge 2.1)或((// @ SchemaVersion lt 2.1)而不是(@ContentPositionRule))')模式类型'#AnonType_Page'上的'失败。
在XMLSpy中,如果将SchemaVersion设置为2.0,则断言失败。如果将其设置为2.1,则断言成功。
我需要设置一些功能标志吗?
更新: 显然XMLSpy允许了它不应该允许的事情。
因此,所需的测试是 如果(SchemaVersion <2.1)并且任何元素包含“ ContentPositionRule”属性,那么它将失败。
答案 0 :(得分:1)
将断言上移到层次结构中的某个级别,并确保它仅引用关联元素的后代:
{{1}}
断言仅允许引用其出现的元素以及该元素的后代,而不是其祖先,兄弟姐妹等。
另请参见:
尽管从技术上(尽管无济于事)一致,不对出现断言的元素的同级或祖先断言提供诊断帮助,但XMLSpy不应根据同级或祖先状态报告不同的验证结果。
W3C XML Schema Definition Language (XSD) 1.1 Part 1: Structures
Validation Rule: Assertion Satisfied
[...]
1.3根据“部分”架构后验证信息集,如[XDM]中所述构造数据模型实例。根节点 [XDM]实例是从E构造的;数据模型实例包含 仅该节点和根据[属性]构造的节点, [孩子]和E的后代。注意:这是此的结果 试图在断言中引用同胞的构造 或E的祖先,或E之外的输入文档的任何部分 本身,将不会成功。此类尝试引用不在 本身就是错误,但是用于评估它们的数据模型实例 不包括文件任何部分的任何表示 在E之外,因此无法引用它们。
注意:这是这种构造的结果,试图在断言中引用E的兄弟姐妹或祖先,或任何E E本身之外的输入文档的一部分将不成功。 这种尝试引用本身不是错误,而是数据 用于评估它们的模型实例不包括任何 E之外的文档任何部分的表示形式,因此它们 不能被引用。
[ 强调 。]