【问题标题】:XSD schema only one element appears multiple times while xs:allXSD 模式只有一个元素出现多次,而 xs:all
【发布时间】:2015-01-21 13:21:01
【问题描述】:

我有一个看起来像这样的架构:

<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Contacts">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Contact" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:all>
                        <xs:element name="Id">
                            <xs:simpleType>
                                <xs:restriction base="xs:integer">
                                  <xs:minLength value="1"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="Name">
                            <xs:simpleType>
                                <xs:restriction base="xs:token">
                                    <xs:pattern
                                    value="[a-z\-_]+"
                                    />
                                  </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="Mobile">
                            <xs:simpleType>
                                <xs:restriction base="xs:Integer">
                                    <xs:minLength value="1"/>
                                  </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                    </xs:all>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
 </xs:element>

现在的要求是我们可以为每个联系人添加多个手机号码,即一个xml,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Contacts>
  <Contact>
    <Id>1</Id>
    <Name>Rebecca</Name>
    <Mobile>1234</Mobile>
    <Mobile>4567</Mobile>
  </Contact>
</Contacts>

由于xsd 中的Contact 元素使用xs:all,它不允许添加多个Mobile 元素。 有没有办法允许多个 Mobile 元素但只出现一次其余元素? Name & Id 应该只在 xml 中出现一次。

【问题讨论】:

    标签: xml xsd xsd-validation


    【解决方案1】:

    这是可能的,但您必须更改 &lt;Contact&gt; 元素的模型,尤其是关于元素的顺序。

    如果您确定先出现&lt;Id&gt;,然后是&lt;Name&gt;,然后是至少一个&lt;Mobile&gt;,那么这可能是一个解决方案:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="qualified">
      <xs:element name="Contacts">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Contact" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Id">
                    <xs:simpleType>
                      <xs:restriction base="xs:integer">
                        <xs:minInclusive value="1"/>
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:element>
                  <xs:element name="Name">
                    <xs:simpleType>
                      <xs:restriction base="xs:token">
                        <xs:pattern value="[A-Za-z\-_]+"/>
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:element>
                  <xs:element name="Mobile" maxOccurs="unbounded">
                    <xs:simpleType>
                      <xs:restriction base="xs:integer">
                        <xs:minInclusive value="1"/>
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    此外,&lt;xs:minLength&gt; 不允许作为 xs:integer 的限制方面。我以为你的意思是&lt;xs:minInclusive&gt;

    【讨论】:

    • 你知道 xs:sequence 是否保证我们不能有多个 ID 或名称吗?我认为可能会违反除移动设备之外的每种类型都有一个元素的想法。尽管您的解决方案似乎是最简单的方法。
    • 在这种情况下,确实如此。我没有设置任何 minOccurs 或 maxOccurs,所以它假定您只需要一个 Id 和一个 Name。
    • 谢谢,这就是解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 2021-03-22
    相关资源
    最近更新 更多