Если я попробую эту схему:
<?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
), а значение ограничивающего фасета зависит от простого типа, который вы ограничиваете.