很容易在一个XML中定义两个名称相同的元素,比如<any>
和不同的允许子元素。一个应该声明两个XSD类型AnyType1
和AnyType2
为complexTypes
,它描述了允许的子元素。然后可以在一个上下文中将元素<any>
声明为<xs:element name="any" type="AnyType1" />
,在另一个上下文中声明为<xs:element name="any" type="AnyType2" />
。我的问题是,AnyType1
和AnyType2
都是递归的。要在XSD中定义递归类型,我使用以下语法
<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>
这种语法的缺点是,我们必须在模式"any"
的顶部声明元素,以后不能使用<xs:element name="any" type="AnyType2" />
来定义递归类型AnyType2
。
我的问题是:如何在同一个名称空间中的同一个XML模式中声明两个递归元素类型.
我的问题的背景如下。我需要定义描述某些测试的XML模式。应该结合(分组) <all>
和<any>
元素(“或”和“和”操作)来描述某些测试的结果。在一个上下文中(在XML文件的一个位置),我需要允许测试的一个子集,它可以由<all>
和<any>
分组,而在另一个地方,应该允许其他子元素。所以我不想定义<anyTest1>
和<anyTest2>
元素,也不想定义<n1:any>
和<n2:any>
。我只想使用<any>
,但是如果<any>
是<TestBeforeProgramStart>
的子元素,我希望允许子元素的一个子集,如果<any>
是<TestAfterProgramEnd>
的另一个子集。
发布于 2010-08-31 16:05:55
我自己在问题上找到了答案。看起来很简单。
它不需要在<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>
因此,我所描述的问题似乎并不存在。
https://stackoverflow.com/questions/3552150
复制