2

我在使用 xml 架构时遇到了问题。

首先,我想向您展示 xml 的可能情况:

1.

<arrivalDate>01.01.2012</arrivalDate>

2.

<arrivalDate>01.01.2012</arrivalDate>
<departureDate>04.01.2012</departureDate>

3.

<arrivalDate>01.01.2012</arrivalDate>
<presentee>
    <firstName>User</firstName>
</presentee>

4.

<arrivalDate>01.01.2012</arrivalDate>
<departureDate>04.01.2012</departureDate>
<presentee>
    <firstName>User</firstName>
</presentee>

5.

<arrivalDate>later</arrivalDate>
<presentee>
    <firstName>User</firstName>
</presentee>

6.

<arrivalDate>later</arrivalDate>
<departureDate>5</departureDate> <!-- 1 till 5 extra days -->
<presentee>
    <firstName>User</firstName>
</presentee>

情况 5 和 6 只有在设置了 Presentee 时才可能。

现在我创建了一个模式来处理这个:

<xs:choice>
    <xs:sequence>
        <xs:choice>
            <xs:sequence>
                <xs:element name="arrivalDate" type="date" />
                <xs:element name="departureDate" type="date" minOccurs="0" maxOccurs="1" />
            </xs:sequence>
            <xs:sequence>
                <xs:element name="arrivalDate" type="xs:string" fixed="later" />
                <xs:element name="departureDate" minOccurs="0" maxOccurs="1">
                    <xs:simpleType>
                        <xs:restriction base="xs:integer">
                            <xs:minInclusive value="1" />
                            <xs:maxInclusive value="5" />
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
        </xs:choice>
        <xs:element name="presentee" minOccurs="1" maxOccurs="1">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="title" type="title"/>
                    <xs:element name="firstName" type="name" />
                    <xs:element name="lastName" type="name" />
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
    <xs:sequence>
        <xs:element name="arrivalDate" type="date" />
        <xs:element name="departureDate" type="date" minOccurs="0" maxOccurs="1" />
    </xs:sequence>
</xs:choice>

我尝试了对结构的几处更改,以处理问题,但我没有得到“好的”解决方案。

4

2 回答 2

3

您的 XML 模式具有不确定性的原因是,当将其应用于 XML 文档时,它无法确定您所指的到达日期和离开日期的定义中的哪一个。您的想法是,第一个<choice>指令让您在这些元素的一组定义之间进行选择,然后是一个受邀者元素,或者另一个没有受邀者元素的定义。不幸的是,XML Schema 不执行一些前瞻。

解析后,XML 事件将一一呈现给验证器。因此,arrivalDate 已提供给您的架构,现在它必须知道该元素是否有效,但是......它无法确定这些到达日期定义中的哪一个适用。如果它可以将该决定推迟到稍后解析后续元素时,它可以,例如它如何通过丢失某些子元素来决定一个元素是无效的。但是考虑到它们是分开的,这是不可能的。

W3C XML Schema 不擅长以下几点:无序内容和跨节点限制。就像 Kevin 建议的那样,XML Schema 1.1 可能对此有答案。我没有使用它。其他要检查的选项是 RelaxNG,它比 XML Schema 更灵活、更强大,或者 Schematron,它允许进行这种需要比结构和简单类型检查更深入的验证。

于 2016-02-11T17:53:14.083 回答
2

这不是 XSD 1.0 可以处理的。XSD 模型是确定性的,正如您所意识到的,您的语言不是确定性的。

您可以使用 union 来获得可以是日期或某些特定字符串值的类型,但是 XSD 中没有任何内容可以让您指定当到达/离开不仅仅是日期时必须存在稍后的元素。

我不知道 XSD 1.1 是否适合您,但它有断言,这可能会对您有所帮助。

于 2012-02-16T17:23:54.337 回答