Разрешает ли сложное расширение xs:anyType текстовый контент?

У меня есть следующий сложный тип:

<xs:complexType name="ValuePropertyType">
    <xs:complexContent>
        <xs:extension base="xs:anyType">
            <xs:attribute name="recordCount" type="xs:positiveInteger"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

Разрешает ли он простой текстовый контент? Нравиться:

<my:values>
2007-04-01T00:00:00.000-06:00,30.4,28.8,155.8,1055.32,55,haze
2007-04-01T00:00:10.000-06:00,30.4,28.8,155.8,1055.4,59,haze
</my:values>

Я думаю, что да, но найти нормативную ссылку в спецификации XML-схемы довольно... сложно.

Я также спрашиваю, потому что JAXB XJC генерирует здесь следующее свойство:

@XmlAnyElement
protected List<Element> any;

Который только ожидает элементов. Я думаю, что он также должен разрешить текст.

Обновить

Xerces, Eclipse (все, что используется ниже), Stylus Studio и Oxygen подтвердили этот пример против эта схема. В частности, это сложный тип в вопросе:

<xs:complexType name="DataValuePropertyType">
    <xs:annotation>
        <xs:documentation>Use to point or include data values inline</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
        <xs:extension base="xs:anyType">
            <xs:attribute name="recordCount" type="xs:positiveInteger"/>
            <xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

person lexicore    schedule 05.04.2015    source источник


Ответы (4)


Формальное определение можно найти в части 1 спецификации схемы XML, в §2.2.1.1 XML-схема 1.0, XML-схема 1.1 и §3.4.7 XML-схема 1.0, XML-схема 1.1. В зависимости от версии формулировка немного отличается, но в итоге она похожа.

В версии 1.1 более ясно, что anyType представляет собой смешанный контент, поэтому он допускает одновременно текстовый контент и теги в нем.

Поскольку ваш complexContent является расширением этого смешанного контента, он также является смешанным типом контента.

Однако кажется немного странным предоставлять расширения на основе anyType, поскольку он уже допускает любой контент, а также любой атрибут. В спецификации, если вы посмотрите на §3.4.7, упоминается, что метод вывода является ограничением.

person potame    schedule 07.04.2015
comment
Отлично, именно то, что я искал. - person lexicore; 08.04.2015

Сложный тип с complexContent не допускает текстовое содержимое в качестве дочернего, если только он не объявлен mixed="true". Если вы сделаете его смешанным, то он позволит произвольным текстовым узлам смешиваться между любыми элементами, которые допускает модель содержимого, вы не можете ограничить текст определенным типом (если только вы не используете simpleContent, но тогда это не позволяет дочерним элементам в все).

person Ian Roberts    schedule 05.04.2015
comment
Я только что проверил свой пример в вопросе weatherObservation.xml против om.xsd используя xsdv, он прошел проверку. Буду пробовать другие инструменты. - person lexicore; 05.04.2015
comment
Stylus Studio и Eclipse также без проблем проверили документ. - person lexicore; 05.04.2015
comment
Хм, Oxygen тоже говорит, что это действительно... Я озадачен. - person lexicore; 05.04.2015

@potame уже дал правильный ответ раньше меня. Но с тех пор

найти нормативную ссылку в спецификации схемы XML довольно... сложно

Я хотел бы дать вам такую ​​ссылку на месте, вместо ссылок на спецификации.

Таким образом, если атрибут base вашего xs:extension имеет значение xs:anyType, все разрешено в качестве его содержимого до ограничения. Спецификация действительно расплывчата, хорошие ссылки

[...] anyType, который допускает любое дочернее и/или символьное содержимое данных и любые атрибуты, если это правильно сформированный XML.

Уолмсли, Присцилла. Окончательная XML-схема. Окончательная XML-серия Чарльза Ф. Гольдфарба. Прентис Холл: 2012. С. 97.

anyType — универсальный сложный тип, допускающий все что угодно; любые атрибуты, любые дочерние элементы, любой текстовый контент.

Уолмсли, Присцилла. Окончательная XML-схема. Окончательная XML-серия Чарльза Ф. Гольдфарба. Прентис Холл: 2012. С. 203.


Затем примечание о дизайне схемы: определение сложных типов как расширений xs:anyType приводит к нестрогому (то есть не очень строгому) документу XML-схемы. На практике это означает, что набор документов, допустимых согласно полученной схеме, намного больше необходимого — и схема не дает детального контроля над структурами в документах.

XML-схема, например

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:attributeGroup name="AssociationAttributeGroup">
        <xs:attribute name="id" type="xs:ID"/>
    </xs:attributeGroup>

    <xs:element name="item" type="DataValuePropertyType"/>

    <xs:complexType name="DataValuePropertyType">
        <xs:annotation>
            <xs:documentation>Use to point or include data values inline</xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:extension base="xs:anyType">
                <xs:attribute name="recordCount" type="xs:positiveInteger"/>
                <xs:attributeGroup ref="AssociationAttributeGroup"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

даже не требует, чтобы атрибуты, явно определенные в теле расширения, действительно появлялись во входном документе, поскольку в них отсутствует атрибут use, значением по умолчанию которого является "optional".

person Mathias Müller    schedule 07.04.2015
comment
Спасибо за ссылки! Очень хороший ответ. Я не разрабатывал эту схему, также нашел конструкцию... странной. - person lexicore; 08.04.2015
comment
@Mathias Müller Спасибо также за ссылку, я постараюсь получить копию. Я использую XML-схему ван дер Влиста (O'Reilly), но anyType определение в этой книге слишком краткое. И это не соответствует XML-схеме 1.1. - person potame; 08.04.2015

Обоснование обработки JAXB anyType можно найти в разделе 6.3.3 JAXB (JSR -22) и цитируется ниже:

6.3.3xsd:anyType

xsd:anyType is the root of the type definition hierarchy for a schema. All
complex type definitions in a schema implicitly derive from xsd:anyType.
Given that the JAXB 2.0 architecture does not define a common base class for
all JAXB class bindings of complex type definitions, the only possible binding
property base type binding for xsd:anyType is to java.lang.Object.
This binding enables all possible type and element substitutions for an element
of type xsd:anyType.

CODE EXAMPLE 6-1 Binding of element with type xsd:anyType

<xs:element name="anyContent/> <!--@type defaults to xs:anyType-->
    <xs:complexType name="base">
        <xs:sequence>
            <xs:element ref="anyContent/>
            <xs:element name="anyContentAgain" type="xs:anyType"/>
        </xs:sequence>
    </xs:complexType>

public class Base {
    void setAnyContent(Object obj);
    Object getAnyContent();
    void setAnyContentAgain(Object obj);
    Object getAnyContentAgain();
}

A schema author defines an element to be of type xs:anyType to defer
constraining an element to a particular type to the xml document author.
Through the use of xsi:type attribute or element substitution, an xml
document author provides constraints for an element defined as xs:anyType.
The JAXB unmarshaller is able to unmarshal a schema defined xsd:anyType
element that has been constrained within the xml document to an easy to access
JAXB mapped class. However, when the xml document does not constrain the
xs:anyType element, JAXB unmarshals the unconstrained content to an
element node instance of a supported DOM API.

Type substitution is covered in more detail in Section 6.7.4.1 and 6.7.4.2.
Element substitution is covered in more detail in Section 6.7.5.
person bdoughan    schedule 07.04.2015
comment
Интересно; для людей (таких как я), которые знают XSD, но не JAXB - не могли бы вы также объяснить, почему JAXB XJC (предположительно, см. Выше) интерпретирует сложный тип XSD, расширенный из xs:anyType, как не разрешающий текстовое содержимое? - person Mathias Müller; 07.04.2015
comment
@MathiasMüller Это хорошо воспроизводится с XJC. А добавление mixed="true" к сложному типу делает его List<Serializable> вместо List<Element>, что позволяет использовать текстовое содержимое. Я бы посчитал это ошибкой. Либо в XJC, либо в спецификации JAXB. - person lexicore; 08.04.2015
comment
@lexicore Я не сомневаюсь, что расширения anyType генерируют List<Element> свойства - или ваш опыт. Я имел в виду использовать якобы в том смысле, что у меня нет средств и знаний, чтобы воспроизвести это самому. Я согласен - это кажется несовместимым со спецификацией XSD, но, возможно, у Блеза есть объяснение такому поведению. - person Mathias Müller; 08.04.2015
comment
@MathiasMüller Не беспокойтесь, я абсолютно не воспринимал это как оскорбление. :) Извините, если это выглядело так. Моя точка зрения была в первую очередь о mixed="true". - person lexicore; 08.04.2015