2

我怀疑是否有一些模式具有有效模式但没有一些 XML 文档?如果有,你能给我举一些例子吗?

4

1 回答 1

3

是的,可以定义有效文档集为空集的模式——至少在我所知道的每种模式语言中,并给出“有效文档”的合理定义。

在 XSD、RNG 和 DTD 中,可能最简单的这种模式是不声明任何元素的模式。在 XSD 中,这可以这样表达:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"/> 

通过声明具有不可满足类型的元素,一个简单的非空模式可能是不可满足的:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="unsatisfiable">
    <xs:complexType>
      <xs:choice/>
    </xs:complexType>
  </xs:element>
</xs:schema> 

由于 xs:choice 要求至少有一个选择的孩子与输入匹配,因此没有孩子的选择是不可满足的。如果需要选择,就像这里一样,那么整个类型是无法满足的。

空选项也可以在 Relax NG 中使用,但不能在 DTD 中使用。

在 Relax NG 中,还可以在没有有效实例的模式中声明可满足元素,只要根元素或根元素的至少一个必需的后代是不可满足的。相比之下,在 XSD 中,一旦有了任何可满足的元素声明或类型定义,您就不再有空语言:XSD 无法在模式中说明验证时最外层元素必须是什么。

在 XSD、RNG 和 DTD 中,还可以通过要求元素包含未声明的元素来使元素无法满足。在 DTD 表示法中:

<!ELEMENT unsatisfiable (undeclared) >

此外,在任何这些语言中,都可以定义只能由无限文档满足的模式:

<!ELEMENT e (e) >

在 XSD 中(以及在使用 XSD 数据类型的 Relax NG 中)也可以定义空的简单类型:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="unsatisfiable">
    <xs:simpleType>
      <xs:restriction base="xs:integer">
        <xs:minExclusive value="0"/>
        <xs:maxExclusive value="1"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
</xs:schema> 

XSD 禁止定义空类型的某些方法:例如,将最小和最大排他值设置为相同的值,将引发 XSD 错误。(这里的理由是,WG 中的大多数人认为空类型没有意义,并且还误以为它们可以有效地阻止空类型的定义,至少在不涉及正则表达式模式的情况下。作为示例显示,他们错了。)在 XSD 1.1 中,定义不可满足的简单类型的最简洁和最明显的方法可能是定义一个空联合类型,但更简单的方法是使用预定义xs:error类型(它本身已定义作为一个空联合)。这在 XSD 1.0 中是不可能的,它要求联合至少有两种成员类型。

于 2013-01-23T16:12:44.707 回答