在以后的编辑中添加的问题的替代表达形式似乎仍未得到解答:如何指定元素的子元素中必须有一个命名为child3
,一个命名为child4
,以及任何命名为child1
或的数字child2
,且顺序不受限制孩子出现的地方。
这是一种可以直接定义的常规语言,并且您需要的内容模型与正则表达式同构,该正则表达式定义了一组字符串,其中数字“ 3”和“ 4”分别恰好出现一次,数字“ 1”和“ 2” '发生了很多次。如果不清楚如何编写此语言,则可能会考虑考虑要构建哪种有限状态机来识别这种语言。它将至少具有四个不同的状态:
- 初始状态,其中既没有看到“ 3”也没有看到“ 4”
- 中间状态,其中已看到“ 3”,但未看到“ 4”
- 中间状态,其中已看到“ 4”,但未看到“ 3”
- 最终状态,其中已经看到“ 3”和“ 4”
无论自动机处于什么状态,都可以读取“ 1”和“ 2”。它们不会更改机器的状态。在初始状态下,“ 3”或“ 4”也将被接受;在中间状态下,仅接受“ 4”或“ 3”;在最终状态下,不会接受“ 3”或“ 4”。如果我们首先为仅出现“ 3”和“ 4”的语言子集定义一个正则表达式,则最容易理解正则表达式的结构:
(34)|(43)
为了允许“ 1”或“ 2”在给定位置出现多次,我们可以插入(1|2)*
(或者[12]*
如果我们的正则表达式语言接受该表示法)。在所有可用位置插入此表达式,我们得到
(1|2)*((3(1|2)*4)|(4(1|2)*3))(1|2)*
将其转换为内容模型非常简单。基本结构与regex等效(34)|(43)
:
<xsd:complexType name="paul0">
<xsd:choice>
<xsd:sequence>
<xsd:element ref="child3"/>
<xsd:element ref="child4"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element ref="child4"/>
<xsd:element ref="child3"/>
</xsd:sequence>
</xsd:choice>
</xsd:complexType>
插入零或更多选择child1
和child2
很简单:
<xsd:complexType name="paul1">
<xsd:sequence>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
<xsd:choice>
<xsd:sequence>
<xsd:element ref="child3"/>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
<xsd:element ref="child4"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element ref="child4"/>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
<xsd:element ref="child3"/>
</xsd:sequence>
</xsd:choice>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
如果我们希望尽量减少散装一点,我们可以定义一个名为组的重复选择child1
和child2
:
<xsd:group name="onetwo">
<xsd:choice>
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
</xsd:group>
<xsd:complexType name="paul2">
<xsd:sequence>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
<xsd:choice>
<xsd:sequence>
<xsd:element ref="child3"/>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child4"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element ref="child4"/>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child3"/>
</xsd:sequence>
</xsd:choice>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
在XSD 1.1中,all
已解除了对-group的某些限制,因此可以更简洁地定义此内容模型:
<xsd:complexType name="paul3">
<xsd:all>
<xsd:element ref="child1" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child2" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child3"/>
<xsd:element ref="child4"/>
</xsd:all>
</xsd:complexType>
但是从前面给出的示例可以看出,对all
-group的这些更改实际上并不会改变语言的表达能力;它们只会使某些语言的定义更加简洁。