使用递归XML模式类型的问题

时间:2010-08-23 22:18:22

标签: xml recursion xsd

很容易在一个XML模式和不同的允许子元素中定义两个具有相同名称的元素,如<any>。我们应该将两个XSD类型AnyType1AnyType2声明为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>另一个子集的子元素。

1 个答案:

答案 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>

所以我描述的问题似乎并不存在。