我有一些我无法控制的XML文档。它们的结构定义明确,但它在一堆PDF中描述,尽管非常精确,但它们并不能使自动验证变得非常易于处理。我正在尝试编写XML模式,以使(大部分)PDF格式的规则可执行。
所有要素都是强制性的。但是其中大约一半可能是空的或具有简单的类型内容。
为这些元素定义数据类型时,我定义了两个版本:一个是“普通”,另一个是空。我通过使用empty
数据类型定义联合来完成此操作:
<xs:simpleType name="empty">
<xs:restriction base="xs:string">
<xs:length value="0"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="codPostal">
<xs:restriction base="xs:string">
<xs:pattern value="^[0-9]{4}-[0-9]{3}$"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="opt_codPostal">
<xs:union memberTypes="empty codPostal"/>
</xs:simpleType>
这样做的重复性较低吗?
答案 0 :(得分:6)
您可以使用xs:nillable。
在XSD中
<xs:simpleType name="codPostal">
<xs:restriction base="xs:string">
<xs:pattern value="^[0-9]{4}-[0-9]{3}$"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="OptionalString" type="codPostal" nillable="true" />
在文档中
<OptionalString xsi:nil="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
这对非字符串类型(例如日期时间等)最有用,就像你可以使用零长度的字符串一样。
<OptionalString />
不幸的是,您需要在文档上指定“nil”属性。据我所知,做你想做的唯一非侵入式的方法是你已经选择的联合类型方法。