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

发布于 2024-09-15 08:02:03 字数 1714 浏览 4 评论 0原文

在一个 XML 模式中定义两个具有相同名称的元素(如 )以及允许的不同子元素是很容易的。只需将两种 XSD 类型 AnyType1AnyType2 声明为 complexTypes 即可,它描述允许的子元素。然后,可以在一个上下文中将元素 声明为 在另一个上下文中。我的问题是 AnyType1AnyType2 都是递归的。要在 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" 在架构顶部,我们可以'稍后不要使用 来定义递归类型 AnyType2

我的问题是:如何在同一命名空间的同一 XML 架构中声明两个递归元素类型。

我的问题的背景如下。我需要定义描述一些测试的 XML 模式。测试应结合 元素(“or”和“and”操作)进行组合(分组),以描述某些结果测试。在一个上下文中(在 XML 文件的一个位置),我需要允许一个测试子集,这些测试可以按 分组,而在另一个上下文中应允许放置其他子元素。所以我不想定义 元素或 。我只想使用 ,但如果 的子元素,我希望允许子元素的一个子集如果 另一个子集的子元素。

It is easy to define two elements with the same name like <any> in one XML schema and different permitted subelements. One should just declare two XSD types AnyType1 and AnyType2 as complexTypes which describes permitted subelements. Then one can declare element <any> in one context as <xs:element name="any" type="AnyType1" /> and as <xs:element name="any" type="AnyType2" /> in another context. My problem is that both AnyType1 and AnyType2 are recursive. To define a recursive type in XSD I use the following syntax

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

Disadvantage of this syntax is that we have to declare the element "any" on the top of schema and we can’t use <xs:element name="any" type="AnyType2" /> later to define recursive type AnyType2 somewhere later.

My question is: how to declare two recursive element types in the same XML schema in the same namespace.

The background of my question is following. I need to define XML schema which describe some tests. The tests should be combined (grouped) with respect of <all> and <any> elements ("or" and "and" operations) to describes results of some tests. In one context (in one place of XML file) I need to allow one subset of tests which can be grouped by <all> and <any> and in another place other subelements should be permitted. So I don’t want to define <anyTest1> and <anyTest2> elements or <n1:any> and <n2:any>. I want just use <any>, but if <any> is subelement of <TestBeforeProgramStart> I want allow one subset of subelements and if <any> is subelement of <TestAfterProgramEnd> another subset.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最美的太阳 2024-09-22 08:02:03

我自己找到了我的问题的答案。看起来很简单。

不需要在 >,所以类型 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>

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

I found the answer on my question myself. It seems very simple.

It is not need to declare <xs:element name="any" type="AnyType1" /> before <xs:complexType name="AnyType1">, so the declaration of the type AnyType1 can be just following

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

So the problem which I described seems not really exist.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文