我有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(通常是为了回收文档的注释等),所以简单性很重要。
答案 0 :(得分:1)
虽然在XSD 1.1中这在技术上是可行的,但解决方案不是很好...
我得到的解决方案将所有内容粘贴在xs:all
中,然后使用xs:assert
(仅XSD 1.1)提供规则。
此解决方案虽然有效,但难以阅读和维护,并且与XSD 1.0不兼容。我倾向于您描述的choice(seq(b,c),seq(d,e))解决方案,并将实现的责任推给实现者
<?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>