Я настраиваю схему для нашего ввода / вывода xml и столкнулся с проблемой, при которой XMLSpy проверяется нормально, но Xerces завершается ошибкой на одном из утверждений xs :.Я использую последнюю версию 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-утверждение: оценка утверждения ('(// @ SchemaVersion ge 2.1) или ((// // SchemaVersion lt 2.1), а не (@ContentPositionRule))')для элемента «Страница» в типе схемы «#AnonType_Page» не удалось.
В XMLSpy, если я установлю SchemaVersion на 2.0, утверждение не будет выполнено.Если я установлю его на 2.1, утверждение выполнится успешно.
Есть ли какой-нибудь флаг Feature, который мне нужно установить?
Обновление: очевидно, XMLSpy разрешает вещи, которые он не должен разрешать.
Итак, желаемым тестом является то, что если (SchemaVersion <2.1) AND какой-либо элемент содержит атрибут «ContentPositionRule», ТОГДА он должен завершиться неудачей. </p>