Смешанный наследуется при расширении complexType?
У меня есть следующее в схеме:
<xs:element name="td">
<xs:complexType>
<xs:complexContent>
<xs:extension base="cell.type"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:complexType name="cell.type" mixed="true">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element ref="p"/>
</xs:sequence>
</xs:complexType>
Некоторые парсеры разрешают PCDATA непосредственно в элементе, а другие нет. В рекомендации XSD (3.4.2) есть что-то, что когда сложный тип имеет сложное содержимое и ни один из них не имеет смешанного атрибута, эффективный смешанный является ложным. Это означает, что единственный способ использования смешанного содержимого - это если расширение cell.type вызывает наследование mixed="true".
Может ли кто-нибудь, более знакомый со схемами, прокомментировать правильную интерпретацию?
(Кстати: если бы у меня был контроль над схемой, я бы переместил mixed="true" в определение элемента, но это не мой вызов.)
1 ответ
Любой, кто читает мой вопрос, может захотеть также прочитать эту ветку ( Damien). Кажется, мой ответ не совсем верен: парсеры / валидаторы не обрабатывают смешанные объявления атрибутов для базовых / производных элементов одинаково.
Что касается расширенных сложных типов, то в подразделе 1.4.3.2.2.1 раздела 3.4.6 в части 1 спецификации XML-схемы W3C говорится, что
Оба [производных и базовых] {типа содержимого} должны быть смешаны, или оба должны быть только для элементов.
Так что да, он наследуется (или, более того, вы не можете его перезаписать - то же самое в конце).
По сути, вы описали желаемое (и, насколько мне известно, самое логичное) поведение.
Я создал простую схему для запуска небольшого теста с помощью инструментов Eclipse XML.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="c">
<xs:complexType>
<xs:complexContent mixed="false">
<xs:extension base="a"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:complexType name="a" mixed="true">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="b"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Вышеприведенная схема действительна в том смысле, что ни Eclipse, ни "официальный" валидатор W3C XML Schema не замечают никаких проблем с ней.
Следующий XML проходит проверку по вышеупомянутой схеме.
<?xml version="1.0" encoding="UTF-8"?>
<c xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd">
x
<b/>
y
</c>
Таким образом, вы не можете перезаписать смешанность сложного базового типа. Чтобы поддержать это утверждение, попробуйте поменять местами базовые и смешанные типы. В этом случае XML не проходит проверку, потому что производный тип не будет смешан, так как он (еще раз) не может перезаписать смешанность базы.
Вы также сказали, что
Некоторые парсеры позволяют PCDATA непосредственно в элементе, в то время как другие не позволяют
Не помешало бы уточнить, о каких парсерах вы говорите. Хороший парсер не должен потерпеть неудачу, когда встречается со смешанным контентом. Проверяющий синтаксический анализатор, при условии правильной схемы, потерпит неудачу, если встретит смешанное содержимое, когда схема не позволяет этого.