0

假设我有以下 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 属性,有人知道吗?

4

2 回答 2

1

我的问题是,我应该在哪里为元素添加属性 minOccurs 和 maxOccurs OwnerEnglishName

关于 的(非全局)声明OwnerEnglishName

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

我想保留 xs:all 因为我想避免必须按 > 顺序订购我的 XML 文件

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

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


更新(根据评论中示例的 OP 更改以将其他子元素包含到xs:all):

然后,您有三个选择:

  1. 强加一个命令。这几乎总是最好的答案,因为在实践中几乎总是不需要允许任何排序的感知需要。
  2. 使用 XSD 1.1,它xsd:all允许maxOccurs="unbounded".
  3. xsd:all更改 XML 设计以在您希望允许重复的子元素周围使用包装器元素。(见这里的例子。)
于 2016-07-22T16:51:22.083 回答
-1

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

<?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 的 Occurs 限制。

于 2016-07-26T09:19:31.057 回答