XSD全部内在选择

时间:2019-01-22 02:36:51

标签: xml xsd

我有this other question的反需求。

我希望以下任何一项有效:

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

我尝试用两个choice的孩子做一个all,但这是无效的。
看来我可以用两个choice的孩子来做一个sequence,但我不想实现者不必担心元素的顺序。
看起来我可以使用group,但它们需要ref名称,并且内容的选项对其分组没有明显的名称。 (如果他们这样做的话,我本来会以这种方式构造XML。)

我一直在研究XSD 1.1 documentation

我正试图从数据结构生成XSD(通常是为了回收文档的注释等),所以简单性很重要。

1 个答案:

答案 0 :(得分:1)

虽然在XSD 1.1中这在技术上是可行的,但解决方案不是很好...

我得到的解决方案将所有内容粘贴在xs:all中,然后使用xs:assert(仅XSD 1.1)提供规则。

此解决方案虽然有效,但难以阅读和维护,并且与XSD 1.0不兼容。我倾向于您描述的choice(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>