XSD: ограничить simpleContent внутри complexType для пустого элемента - PullRequest
1 голос
/ 04 мая 2019

Вот определение пустого элемента:

<xs:complexType name="processingHook">
    <xs:complexContent>
        <xs:restriction base="xs:anyType">
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

<xs:element name="callMyApp" type="processingHook" />

И XML-документ:

<callMyApp
     xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
     xsi:noNamespaceSchemaLocation='note.xsd'></callMyApp>

Проверка прошла успешно,но когда я заменяю xs:complexContent на xs:simpleContent, я получаю ошибку:

src-ct.2.2: Ошибка представления определения сложного типа для типа 'processingHook'.Когда complexType с simpleContent ограничивает complexType со смешанным содержимым и очищаемой частицей, тогда среди дочерних элементов ограничения должно быть <simpleType>

Я новичок в XSD, поэтому я не понимаюпричина ошибки.

Здесь Я нашел определения элементов, которые позволяют ограничить simpleContent в пределах complexType (но не для пустого элемента):

<xs:element name="title">
    <xs:complexType>
        <xs:simpleContent>
            <xs:restriction base="tokenWithLangAndNote">
                <xs:maxLength value="255"/>
                <xs:attribute name="lang" type="xs:language"/>
                <xs:attribute name="note" use="prohibited"/>
            </xs:restriction>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

Итак, почему он не работает с пустыми элементами?

1 Ответ

0 голосов
/ 05 мая 2019

Если я попробую эту схему:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="processingHook">
        <xs:simpleContent>
            <xs:restriction base="xs:anyType">
            </xs:restriction>
        </xs:simpleContent>
    </xs:complexType>

    <xs:element name="callMyApp" type="processingHook" />
</xs:schema>

Я получу это сообщение об ошибке от oXygen (которое предположительно исходит от Xerces):

Ошибка представления определения сложного типа для типа'processingHook.Когда complexType с simpleContent ограничивает complexType со смешанным содержимым и очищаемой частицей, тогда среди дочерних элементов <restriction>.

должно быть <simpleType>, и это (намного более простое) сообщение об ошибке от Saxon9.9:

Базовый тип простого типа в test.xsd # 6 не является простым типом

Саксонское сообщение об ошибке здесь, возможно, слишком упрощено;но давайте посмотрим, что говорят правила:

В §343 XML-схемы 1.0, часть 1 мы имеем:

Ограничение представления схемы: Представление определения сложного типа OK

    ...all of the following must be true:

    2 If the <simpleContent> alternative is chosen, all of the following must be true:
    2.1 The type definition ·resolved· to by the ·actual value· of the base
 [attribute] must be one of the following:
    2.1.1 ...
    2.1.2 only if the <restriction> alternative is also chosen, a 
complex type definition whose {content type} is mixed and a particle 
which is ·emptiable·, as defined in Particle Emptiable (§3.9.6);
    2.1.3 ...
    2.2 If clause 2.1.2 above is satisfied, then there must be a 
<simpleType> among the [children] of <restriction>.

Таким образом, сообщение об ошибке Xerces (как это часто бывает) довольно прямо взято из спецификации и ссылается на номер пункта (§2.2), содержащий соответствующее правило.

§2.1.2говорит, что сложный тип, который может быть очищен и имеет множество = "mixed", допускает что-то вроде <p>12.3</p>, и поэтому сложный тип с простым содержимым (CTSC) xs:decimal должен считаться допустимым ограничением, потому что каждый экземплярCTSC также является допустимым экземпляром сложного типа, который он ограничивает.Но §2.2, по сути, говорит, что когда вы определяете CTSC, вы должны определить тип простого содержимого.Даже если вы хотите, чтобы простым содержимым была любая строка, вы должны это сказать.

Я подозреваю, что одной из причин этого является то, что xs:restriction обычно определяет один или несколько ограничивающих аспектов (например,как minInclusive или pattern), а значение ограничивающего фасета зависит от простого типа, который вы ограничиваете.

...