如何允许任意次数的元素?
我正在尝试创建一个XSD,并尝试使用以下要求编写定义:
我环顾四周,发现了像这样的各种解决方案:
<xs:element name="foo">
<xsl:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="child1" type="xs:int"/>
<xs:element name="child2" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
但从我的理解xs:选择仍然只允许单个元素选择。 因此,像这样将MaxOccurs设置为无界应该只意味着子元素的“任何一个”可以出现多次。 这是否准确?
如果上述解决方案不正确,我如何才能达到上述我的要求?
编辑 :如果要求如下,会怎么样?
例如,这个xml是有效的:
<foo>
<child1> value </child1>
<child1> value </child1>
<child3> value </child3>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>
但这不是(失踪的孩子3)
<foo>
<child1> value </child1>
<child1> value </child1>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>
在您的问题中的架构中, child1
或child2
可以以任意次序出现,任意次数。 所以这听起来像你在找什么。
编辑:如果你只希望其中的一个出现无限次数,那么无界将不得不继续使用元素:
编辑:修复XML中的类型。
编辑:在maxOccurs中大写O.
<xs:element name="foo">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="child1" type="xs:int" maxOccurs="unbounded"/>
<xs:element name="child2" type="xs:string" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
</xs:element>
在以后的编辑添加的问题的另一种措辞似乎仍是悬而未决:如何指定元素的儿童中,必须有一个名为child3
,一个名为child4
,任何命名数量child1
或child2
,没有约束按照孩子出现的顺序。
这是一种可直接定义的常规语言,您需要的内容模型与定义一组正则表达式同构,该正则表达式定义数字“3”和“4”各自恰好出现一次的字符串集合,数字“1”和“2” '发生任何次数。 如果不明白怎么写这个,可能会帮助你考虑一下你将用什么样的有限状态机来识别这种语言。 它至少有四个不同的州:
无论自动机处于什么状态,都可以读取“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)*
将其转换为内容模型非常简单。 基本结构等同于正则表达式(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
组的一些限制已被解除,因此可以更简洁地定义此内容模型:
<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
群体的这些变化事实上并没有改变语言的表达能力; 他们只会使某些种类的语言的定义更加简洁。
这是最终为我工作的:
<xsd:element name="bar">
<xsd:complexType>
<xsd:sequence>
<!-- Permit any of these tags in any order in any number -->
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="child1" type="xsd:string" />
<xsd:element name="child2" type="xsd:string" />
<xsd:element name="child3" type="xsd:string" />
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
链接地址: http://www.djcxy.com/p/34309.html
上一篇: how to allow elements in any order any number of times?
下一篇: Customized XSD File