【发布时间】:2013-01-07 00:25:54
【问题描述】:
我怀疑是否存在一些具有有效模式但没有一些 XML 文档的模式? 如果有,请给我一些例子吗?
【问题讨论】:
-
您是在问是否可以创建一个无法匹配任何文档的架构?
-
SLaks,确切地说,我试着想象。有没有这样的架构?
标签: xsd dtd relaxng schematron
我怀疑是否存在一些具有有效模式但没有一些 XML 文档的模式? 如果有,请给我一些例子吗?
【问题讨论】:
标签: xsd dtd relaxng schematron
是的,可以定义有效文档集为空集的模式 - 至少在我所知道的每种模式语言中,并给出“有效文档”的合理定义。
在 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 中是不可能的,它要求联合至少有两种成员类型。
【讨论】: