xs:assert始终无法通过xerces验证失败,但可以在xmlspy中使用

时间:2019-09-19 16:25:28

标签: xsd xsd-validation xerces xpath-2.0 xsd-1.1

我正在为我们的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”属性,那么它将失败。

1 个答案:

答案 0 :(得分:1)

将断言上移到层次结构中的某个级别,并确保它仅引用关联元素的后代:

{{1}}

断言仅允许引用其出现的元素以及该元素的后代,而不是其祖先,兄弟姐妹等。

另请参见:

XMLSpy的观察到的行为

尽管从技术上(尽管无济于事)一致,不对出现断言的元素的同级或祖先断言提供诊断帮助,但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之外的文档任何部分的表示形式,因此它们   不能被引用。

[ 强调 。]