我怀疑是否有一些模式具有有效的模式但没有一些XML文档? 如果有的话,请你举一些例子吗?
答案 0 :(得分: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错误。 (这里的理由是工作组中的大多数人认为空类没有任何意义并且还有一种错觉,即他们可以有效地防止空类型的定义,至少在不涉及常规的情况下 - 表达模式。如示例所示,它们是错误的。)在XSD 1.1中,定义不可满足的简单类型的最简洁和最明显的方法是定义一个空的联合类型,但更简单的方法是使用预定义xs:error
类型(本身定义为空联合)。这在XSD 1.0中是不可能的,这要求联合会至少有两种成员类型。