首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSD:将xs:group与xs:all合并?

XSD:将xs:group与xs:all合并?
EN

Stack Overflow用户
提问于 2014-01-21 10:30:19
回答 1查看 3.3K关注 0票数 2

xs:all条目和xs:all条目组合的情况下,我很难找到一个xsd:

样本XSD:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <!-- This group will be reused later -->
    <xs:group name="TGroup">
        <xs:choice>
            <xs:element name="Mixable1" type="xs:string" />
            <xs:element name="Mixable2" type="xs:string" />
            <xs:element name="Mixable3" type="xs:string" />
        </xs:choice>
    </xs:group>

    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:group ref="TGroup" minOccurs="0" maxOccurs="unbounded" />
                <xs:all>
                    <xs:element name="RootContent1" type="xs:string" minOccurs="0" />
                    <xs:element name="RootContent2" type="xs:string" minOccurs="0" />
                </xs:all>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

(这不验证,因为xs:allxs:sequence中是不允许的)

我试图实现的目标:root元素应该始终允许RootContent1RootContent2按任意顺序(因此是xs:all),并且每个元素应该是可选的,但如果有必要,仍然允许所有元素(与xs:choice相反)。

此外,我需要一组可重用的节点(由组TGroup定义),它具有任意数量的任意数量的MixableX元素。它是一个xs:group,因为组本身将被重用(在真正的xsd中),我希望避免声明的重复。

一些示例XML

代码语言:javascript
复制
<root>
    <Mixable1 />
</root>

<root>
    <Mixable2 />
    <RootContent1 />
</root>

<root>
    <Mixable2 />
    <Mixable1 />
    <Mixable2 />
    <RootContent2 />
</root>

我觉得我想要描述的解析器是不确定的,因此不能用XSD来表示,但我还是漏掉了一些东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-21 11:32:24

如果您查看这个:sequence.asp,您将发现您不允许嵌套xs:all在xs:sequence中。

此外,我还试图通过创建一个包含标记的组来欺骗它,但是当它出现时(并且在本文中也引用了:XML Schema: all, sequence & groups)

XML规定,所有组必须显示为内容模型顶部的唯一子组。

但是,如果您不打算同时拥有RootContent1 &2,那么Filburt是正确的,您可以使用另一个选择元素:

代码语言:javascript
复制
<xs:element name="root">
    <xs:complexType>
        <xs:sequence>
            <xs:group ref="TGroup" minOccurs="0" maxOccurs="unbounded"/>
            <xs:choice minOccurs="0">
                <xs:element name="RootContent1" type="xs:string" minOccurs="0"/>
                <xs:element name="RootContent2" type="xs:string" minOccurs="0"/>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
</xs:element>

编辑:这可能是针对这个特定案例的工作,

代码语言:javascript
复制
<xs:element name="root">
    <xs:complexType>
        <xs:sequence>
            <xs:group ref="TGroup" minOccurs="0" maxOccurs="unbounded"/>
            <xs:choice>
                <xs:sequence minOccurs="0">
                    <xs:element ref="RootContent1" minOccurs="0"/>
                    <xs:element ref="RootContent2" minOccurs="0"/>
                </xs:sequence>
                <xs:sequence minOccurs="0">
                    <xs:element ref="RootContent2" minOccurs="0"/>
                    <xs:element ref="RootContent1" minOccurs="0"/>
                </xs:sequence>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:element name="RootContent2" type="xs:string"/>
<xs:element name="RootContent1" type="xs:string"/>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21255486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档