Как разрешить чередование неупорядоченных элементов в XSD? - PullRequest
1 голос
/ 21 октября 2019

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

Я пытался использовать xs:all и xs:sequence, ноэто не работает.

Этот XML должен быть действительным:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="test.xsd">
    <elementB>B</elementB>
    <elementA>A</elementA>
    <elementA>A</elementA>
</test>

, и вот XSD, которые я пробовал:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="test">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="elementA" type="xs:string" 
                            minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="elementB" type="xs:string" 
                            minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Первая XSD-схема имеет проблемус упорядочением.

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
           vc:minVersion="1.1">
    <xs:element name="test">
        <xs:complexType>
            <xs:all>
                <xs:element name="elementA" type="xs:string" 
                            minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="elementB" type="xs:string" 
                            minOccurs="0" maxOccurs="unbounded"/>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>

Второй XSD выглядит многообещающе, но я не могу настроить Intellij, чтобы правильно использовать его для XML. (Я переключил использование XML Schema 1.1 здесь File->Settings->Languages & Frameworks->Schemas and DTDs->Default XML Schemas) Моя версия IntelliJ - 2019.2.3.

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Ваша вторая схема ("перспективная") работает для меня. Пробовал в oXygen и работает нормально. Боюсь, я не знаю, как настроить IntelliJ для проверки XSD 1.1.

Если какой-либо элемент в фиксированном наборе (A, B, C ...) может отображаться в любом количестветогда вам не нужен XSD 1.1: вы можете написать модель контента как

<xs:choice minOccurs="0" maxOccurs="unbounded">
  <xs:element name="A">
  <xs:element name="B">
  <xs:element name="C">
</xs:choice>
1 голос
/ 21 октября 2019

Очевидно, что версия xs:sequence XSD накладывает порядок.

Версия XSD xs:all использует xs:all/xs:element[@maxOccurs="unbounded"], для чего требуется XSD 1.1.

XML Oxygen успешно проверяет ваш XML на соответствие xs:all XSD.

IntelliJ имеет поддержку XSD 1.1, но, возможно, он неполон или, возможно, спецификация здесь неоднозначна - нет времени исследовать это правосейчас.

Однако, если ваш фактический случай так же прост, как и опубликованный вами, вы можете использовать xs:choice для достижения независимости заказа без зависимости от XSD 1.1:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
  vc:minVersion="1.0">
  <xs:element name="test">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="elementA" type="xs:string"/>
        <xs:element name="elementB" type="xs:string"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

Надеюсь, этопозволит вам обойти любую проблему IntelliJ, которая могла блокировать вас.

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