xs: assert всегда терпит неудачу с проверкой xerces, но работает в xmlspy - PullRequest
1 голос
/ 19 сентября 2019

Я настраиваю схему для нашего ввода / вывода 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>

1 Ответ

1 голос
/ 19 сентября 2019

Переместите утверждение вверх на уровень в иерархии и убедитесь, что оно ссылается только на потомков связанного элемента:

<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:assert test=" (@SchemaVersion ge 2.1) or 
                       ((@SchemaVersion lt 2.1) and 
                         not (lit:Page/@ContentPositionRule))       
</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:complexType>
  </xs:element>
</xs:schema>

В утверждении разрешено ссылаться только на элемент, на котором оно появляется, и на элемент потомки - не его предки, братья и сестры и т. Д.

См. Также:

Наблюдаемое поведение XMLSpy

Хотя это технически (хотя и бесполезно) совместимо, чтобы не предоставлять диагностическую помощь для утверждений над братьями и сестрами или предками элемента, на котором появляется утверждениеXMLSpy не должен сообщать о различных результатах проверки в зависимости от состояния родного брата или предка.

Язык определения XML-схемы W3C (XSD) 1.1 Часть 1: Структуры

Правило валидации: Утверждение выполнено

[...]

1.3 Из "частичного" · post-schema-valiВ информационном наборе · экземпляр модели данных строится, как описано в [XDM].Корневой узел экземпляра [XDM] построен из E;Экземпляр модели данных содержит только этот узел и узлы, построенные из [attribute], [children] и потомков E. Примечание. Это следствие этой конструкции, которая пытается ссылаться в утверждении на братьев и сестер или предковE или к любой части входного документа за пределами самой E будет неудачным.Такие попытки ссылки сами по себе не являются ошибками, но экземпляр модели данных, используемый для их оценки, не включает какое-либо представление каких-либо частей документа за пределами E, поэтому на них нельзя ссылаться.

Примечание: Следствием этой конструкции является то, что попытка сослаться в утверждении на братьев и сестер или предков E или на любую часть входного документа за пределами самой E будет безуспешной. Такие попытки ссылки сами по себе не являются ошибками, но экземпляр модели данных, используемый для их оценки, не включает в себя какое-либо представление каких-либо частей документа за пределами E, поэтому на них нельзя ссылаться.

[ Выделение добавлено.]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...