如何在 XSD 文件中将限制与出现指示符结合起来?

How can I combine a restriction with occurence indicators in an XSD file?

假设我有以下 XSD 文件:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified"  elementFormDefault="qualified" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="PACIDemoSignedDoc" type="PACIDemoSignedDocType" />
    <xs:complexType name="PACIDemoSignedDocType">
        <xs:all>
            <xs:element name="OwnerEnglishName" type="OwnerEnglishNameType" />
        </xs:all>
    </xs:complexType>
    <xs:complexType name="OwnerEnglishNameType">
        <xs:simpleContent>
            <xs:restriction base="NameType">
                <xs:enumeration value="John"/>
                <xs:enumeration value="Jack"/>
            </xs:restriction>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="NameType">
        <xs:simpleContent>
            <xs:extension base="xs:string"/>
        </xs:simpleContent>
    </xs:complexType>
</xs:schema>

我的问题是,我应该在哪里为元素 "OwnerEnglishName" 添加属性 minOccurs 和 maxOccurs?我想保留 xs:all,因为我想避免按顺序订购 XML 文件,但它禁止我直接在 <xs:element name="OwnerEnglishName" type="OwnerEnglishNameType" /> 中添加 Occurs 行...

我也猜想我无法在 OwnerEnglishNameType 中添加 Occur 属性,有人知道吗?

My question is, where should I add the attributes minOccurs and maxOccurs for the element OwnerEnglishName ?

关于 OwnerEnglishName 的 (non-global) 声明:

<xs:element name="OwnerEnglishName" type="OwnerEnglishNameType" 
            minOccurs="0" maxOccurs="1"/>

I want to keep xs:all as I want to avoid having to order my XML file in > sequence

在 XSD 1.0 中,您不能在 xs:all 下设置 maxOccurs="unbounded";在 XSD 1.1 中,你可以。

但是,您不需要 xs:all 和单个 child 元素;您可以使用 xs:sequence,因为没有第二个元素对顺序很重要。


更新(每个 OP 在注释中更改示例以将额外的 child 元素添加到 xs:all):

然后你有三个选择:

  1. 强加一个顺序。这几乎总是最佳答案,因为 允许任何排序的感知需求几乎总是不必要的 在实践中。
  2. 使用XSD 1.1,它允许xsd:all的children有maxOccurs="unbounded".
  3. 更改 XML 设计以在您希望允许重复的 xsd:all 的 child 元素周围使用包装元素。 (有关示例,请参阅 。)

好的,我已经解决了我的问题,如果其他人有同样的问题,这里是答案:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" targetNamespace="test" xmlns="test" elementFormDefault="qualified" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="animal" type="AnimalType" />
    <xs:complexType name="AnimalType">
        <xs:all>
            <xs:element name="cats" type="Cats" />
        </xs:all>
    </xs:complexType>    
    <xs:simpleType name="CatType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="John"/>
            <xs:enumeration value="Jack"/>
        </xs:restriction>
    </xs:simpleType>    
    <xs:complexType name="Cats">
        <xs:sequence>
            <xs:element maxOccurs="5" minOccurs="2" name="cat" type="Cat"/>
        </xs:sequence>
    </xs:complexType>    
    <xs:complexType name="Cat">
        <xs:simpleContent>
            <xs:extension base="CatType"/>
        </xs:simpleContent>
    </xs:complexType>    
</xs:schema>

验证以下 xml :

<?xml version="1.0" encoding="UTF-8"?>
<animal xmlns="d" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="test schema.xsd">
    <cats>
        <cat>John</cat>
        <cat>Jack</cat>
    </cats>
</animal>

我通过在 xs:sequence.

后面添加子元素,成功绕过了 xs:all 的发生次数限制