在XSD中无法获取一组最多的子元素

时间:2016-01-21 09:08:26

标签: xml xsd

我有以下架构 -

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="Type">
<xsd:complexType>
<xsd:sequence>
<xsd:choice  minOccurs="0" maxOccurs="unbounded">
<xsd:element name="First">
<xsd:complexType>
<xsd:choice minOccurs="0" maxOccurs="5">
        <xsd:element name="a" type="xsd:decimal" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="b" type="xsd:int" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="c" type="xsd:int" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="d" type="xsd:int" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="e" type="xsd:int" minOccurs="0" maxOccurs="1"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>

<xsd:element name="Second" type="xsd:base64Binary"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

我想要生成的模式是XML可以包含任意次数的First和Second元素以及任何顺序但是元素First应该最多只出现一次子元素。即a,b,c,d,e最多可出现一次。我无法实现子元素最多出现一次的第二部分。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

使用允许元素以任何顺序显示的xsd:choice,而不是xsd:all。对于每个子元素下面的出现面,可以出现一次或根本不出现。

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <xsd:element name="Type">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:choice  minOccurs="0" maxOccurs="unbounded">
                    <xsd:element name="First">
                        <xsd:complexType>
                            <xsd:all maxOccurs="1">
                                <xsd:element name="a" type="xsd:decimal" minOccurs="0" />
                                <xsd:element name="b" type="xsd:int" minOccurs="0"/>
                                <xsd:element name="c" type="xsd:int" minOccurs="0"/>
                                <xsd:element name="d" type="xsd:int" minOccurs="0"/>
                                <xsd:element name="e" type="xsd:int" minOccurs="0"/>
                            </xsd:all>
                        </xsd:complexType>
                    </xsd:element>

                    <xsd:element name="Second" type="xsd:base64Binary"/>
                </xsd:choice>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

验证此架构,像

这样的文档
<?xml version="1.0" encoding="UTF-8"?>
<Type xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="Untitled7.xsd">
    <First>
        <b>10</b>
        <a>10.0</a>
        <c>3</c>
        <d>4</d>
        <e>5</e>
    </First>
    <Second></Second>
</Type>

有效,而以下不是:

<?xml version="1.0" encoding="UTF-8"?>
<Type xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="Untitled7.xsd">
    <First>
        <b>10</b>
        <a>10.0</a>
        <c>3</c>
        <d>4</d>
        <e>5</e>
        <a>10.0</a>
    </First>
    <Second></Second>
</Type>

因为a在同一个First元素中出现两次。