XSD все внутри выбора - PullRequest
       12

XSD все внутри выбора

0 голосов
/ 22 января 2019

У меня обратная потребность от этого другого вопроса .

Я бы хотел, чтобы одно из следующих значений было действительным:

<a>
  <b></b>
  <c></c>
</a>
<a>
  <d></d>
  <e></e>
</a>

Я пытался сделать choice с двумя all детьми, но это неверно.
Похоже, я мог бы сделать choice с двумя sequence дочерними элементами, но я не хочу, чтобы разработчикам приходилось беспокоиться о порядке элементов.
Похоже, что я мог бы использовать group s, но они требуют ref имен, а параметры содержимого не имеют очевидных имен для своих группировок. (Если бы они это сделали, я бы с самого начала структурировал XML.)

Я работал над документацией XSD 1.1 .

Я пытаюсь сгенерировать свой XSD из структуры данных (в основном, чтобы я мог перерабатывать аннотации и т. Д. Для документации), поэтому важна простота.

1 Ответ

0 голосов
/ 24 января 2019

Хотя это технически возможно в XSD 1.1, решение не очень хорошее ...

Полученное мной решение вставляет все в xs:all, затем использует xs:assert (XSD 1.1только) предоставить правила.

Это решение, пока оно работает, трудно читать и поддерживать, и оно не совместимо с XSD 1.0.Я бы склонялся к выбору (seq (b, c), seq (d, e)) решения, которое вы описали, и возложил ответственность на исполнителей, чтобы получить правильный порядок

XSD represented graphically using Liquid XML Studio

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio 2019 BETA (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="a">
        <xs:complexType>
            <xs:all>
                <xs:element name="b" minOccurs="0" />
                <xs:element name="c" minOccurs="0" />
                <xs:element name="d" minOccurs="0" />
                <xs:element name="e" minOccurs="0" />
            </xs:all>
            <xs:assert test="((boolean(b) and boolean(c)) or (boolean(d) and boolean(e))) and not ((boolean(b) and boolean(c)) and (boolean(d) and boolean(e)))" />
        </xs:complexType>
    </xs:element>
</xs:schema>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...