Смешанный наследуется при расширении complexType? - PullRequest
3 голосов
/ 05 января 2012

У меня есть следующее в схеме:

<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 Ответ

4 голосов
/ 05 января 2012

Любой, кто читает мой вопрос, может захотеть прочитать также эту ветку ( Дэмиен ). Кажется, мой ответ не совсем верен: парсеры / валидаторы не обрабатывают смешанные объявления атрибутов для базовых / производных элементов одинаково.


Относительно расширенных сложных типов, подраздел 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, ни «официальный» валидатор XML-схемы W3C не замечают никаких проблем с ней.

Следующий 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 непосредственно в элементе, в то время как другие не

Не помешает уточнить, о каких парсерах вы говорите. Анализатор good не должен завершаться ошибкой при обнаружении смешанного содержимого. Проверяющий синтаксический анализатор при наличии правильной схемы завершится ошибкой, если встретится со смешанным содержимым, когда схема не позволяет этого.

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