xml架构:将出现限制为兄弟元素序列基数

时间:2012-12-20 00:42:00

标签: xsd

假设:

<xs:complexType name="SymbolsList" final="">
    <xs:sequence>
        <xs:element name="symbol" maxOccurs="unbounded">
            <xs:complexType>
                <xs:attribute name="name" type="xs:string" />
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="ComboList">
    <xs:sequence>
        <xs:element name="combo" maxOccurs="unbounded">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="symbol" maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:attribute name="name" type="xs:string" />
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
                <xs:attribute name="comboName" type="xs:string" />
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:complexType>
<xs:element name="symbolsList" type="SymbolsList">
  <xs:unique name="uniqueSymbol">
    <xs:selector xpath="./symbol" />
    <xs:field xpath="@name" />
  </xs:unique>
</xs:element>
<xs:element name="combosList" type="ComboList">
  <xs:unique name="uniqueCombo">
    <xs:selector xpath="./combo" />
    <xs:field xpath="@comboName" />
  </xs:unique>
</xs:element>

我相信这定义了一个符号列表和这些符号的组合列表。 符号列表中的每个条目必须具有唯一的名称,并且组合列表中的每个条目都必须具有唯一的comboName。 我想知道的是,我是否有办法将combosList序列中允许出现的次数限制为至少符号列表中定义的符号数。

我想我在问基数限制是否可以变量,如果是,如何将其限制?

我还想让它成为comboList元素(单个组合)只能使用symbolList元素中定义的符号名称。

我想我可以拉最后一部分。在任何地方都找不到任何关于将不同元素序列的龋齿大小限制在大于或等于一个或另一个的地方。

也许这是不可能的。

1 个答案:

答案 0 :(得分:0)

XSD要求在声明中按字面指定约束的基数;您想到的那种动态计算不在XSD的设计空间中。

在XSD 1.1中,您可以向需要

的SymbolsList和CombosList的一些共同祖先添加断言。
count(CombosList/combo) ge count(SymbolsList/symbol)

XSD 1.1由Saxon EE和Xerces J支持(在后一种情况下,你必须寻找1.1版本,或者最后我看过)。 (需要注意的是:注意Xerces J不支持断言中的所有XPath 2.0,并且我实际上没有检查过这个断言是否被XPath XSD的最小子集覆盖,需要符合1.1实现。在下沉之前进一步调查很多时间在这里。)