определить простые и полные типы с одинаковыми именами в XSD - PullRequest
1 голос
/ 27 мая 2011

Я застрял с проблемой определения xsd.Пожалуйста, помогите найти решение -

У меня возможна двухэлементная структура -

<Books>
 <Book>Effective java</Book>
</Books>

ИЛИ

<Books>
 <Book>
    <Name>Effective java</Name>
    <Author>Josh</Author>
 </Book>
</Books>

Я пытался использовать два разных сложных типа для определения каждого, но проверка не проходит, говоря, что у нас не может быть элемента с несколькими типами.Кроме того, я попытался использовать union, но похоже, что он может работать только на встроенных типах.

Возможно ли это вообще?Если да, пожалуйста, помогите с указателями.

Ответы [ 3 ]

1 голос
/ 27 мая 2011

Я бы сказал, что в этом качестве это невозможно из-за ограничений схемы "уникальная атрибуция частиц" и "объявления элементов согласованы". Практически это означает, что в одном контексте у вас не может быть двух элементов с одинаковыми именами и разными типами. Если это разрешить, схема станет недетерминированной, и поэтому старый <xs:choice> не будет работать. Все обходные пути, которые приходят мне в голову, имеют побочные эффекты.

Возможные обходные пути

1) Переименуйте элементы. Например, определите текстовый элемент книги как <book-title>. Затем вы можете определить различные типы для них и поместить их в <xs:choice>. Проблема, конечно, в переименовании.

2) Сделайте дочерние элементы необязательными и разрешите <book> иметь смешанный контент. Таким образом, вы можете иметь как только текст, так и только контент элемента. Проблема заключается в том, что текстовое содержимое будет разрешено также, когда присутствуют дочерние элементы, и этот текст может появляться до, между и после дочерних элементов.

3) Объявите используемый тип в экземпляре документа. Это можно сделать с помощью атрибута xsi:type="...". Проблемы заключаются в том, что вам нужно специально упомянуть используемый тип в экземпляре документа (с этим дополнительным атрибутом). Также в схеме это обычно делается путем создания абстрактного типа, а ссылочные типы выводятся путем ограничения этого типа. В вашем случае подходящим типом надмножества для <book> может быть xs:anyType, поскольку смешанные типы не могут быть получены из типов, которые не являются смешанными.

4) Использовать другой язык определения структуры, который не требует детерминизма. (RelaxNG может подойти, хотя я не знаком с ним.) Проблема, конечно, заключается в необходимости изучения нового языка и возможном отсутствии поддержки программного обеспечения.

1 голос
/ 30 мая 2011

Получил это решение, которое позволяет смешивать простые и сложные типы -

    <?xml version="1.0" encoding="Windows-1252"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name='Name' type='xs:string'/>
  <xs:element name='Author' type='xs:string'/>
  <xs:element name="Books">
    <xs:complexType>
      <xs:sequence>
        <xs:element name='Book' minOccurs='0'>
          <xs:complexType mixed='true'>
            <xs:all>
              <xs:element ref='Name' minOccurs='0'/>
              <xs:element ref='Author' minOccurs='0'/>
            </xs:all>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
0 голосов
/ 27 мая 2011

Я думаю, что ваша книжная схема - это , состоящая из простого текстового узла и вашего типа, состоящего из имени и автора.Посмотрите в спецификации XSD W3C.

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