很容易在一个XML模式和不同的允许子元素中定义两个具有相同名称的元素,如<any>
。我们应该将两个XSD类型AnyType1
和AnyType2
声明为complexTypes
,其中描述了允许的子元素。然后,可以在一个上下文中将元素<any>
声明为<xs:element name="any" type="AnyType1" />
,将另一个上下文中的<xs:element name="any" type="AnyType2" />
声明为AnyType1
。我的问题是AnyType2
和<xs:element name="any" type="AnyType1" />
<xs:complexType name="AnyType1">
<xs:choice minOccurs="1" maxOccurs="unbounded">
<!-- … some permitted subelements -->
<xs:element name="any" type="AnyType1" />
<!-- … some other permitted subelements -->
</xs:choice>
</xs:complexType>
都是递归的。要在XSD中定义递归类型,请使用以下语法
"any"
这种语法的缺点是我们必须在模式的顶部声明元素<xs:element name="any" type="AnyType2" />
,我们以后不能使用AnyType2
来定义递归类型{{ 1}}以后某个地方。
我的问题是:如何在同一名称空间中的同一XML模式中声明两个递归元素类型。
我的问题的背景如下。我需要定义描述一些测试的XML模式。测试应该与<all>
和<any>
元素(“或”和“和”操作)相结合(分组)来描述某些测试的结果。在一个上下文中(在XML文件的一个位置)我需要允许一个测试子集,可以按<all>
和<any>
分组,而在另一个地方应该允许其他子元素。因此,我不想定义<anyTest1>
和<anyTest2>
元素或<n1:any>
和<n2:any>
。我想只使用<any>
,但如果<any>
是<TestBeforeProgramStart>
的子元素,我想要允许子元素的一个子集,如果<any>
是<TestAfterProgramEnd>
另一个子集的子元素。
答案 0 :(得分:1)
我自己在问题上找到了答案。看起来很简单。
不需要在<xs:element name="any" type="AnyType1" />
之前声明<xs:complexType name="AnyType1">
,因此AnyType1
类型的声明可以跟随
<xs:complexType name="AnyType1">
<xs:choice minOccurs="1" maxOccurs="unbounded">
<!-- … some permitted subelements -->
<xs:element name="any" type="AnyType1" />
<!-- … some other permitted subelements -->
</xs:choice>
</xs:complexType>
所以我描述的问题似乎并不存在。