Xsd 如何使用XML模式允许类型化值为空?
我有一些我无法控制的XML文档。它们的结构定义良好,但在一系列PDF中进行了描述,这些PDF尽管非常精确,但无法使自动验证变得非常容易处理。我正在尝试编写一个XML模式,以使(大部分)这些PDF中的规则可执行 所有要素都是强制性的。但其中大约一半可以是空的,也可以是简单类型的内容 在为这些元素定义数据类型时,我为每个元素定义了两个版本:一个是“普通”版本,另一个可以为空。为此,我使用Xsd 如何使用XML模式允许类型化值为空?,xsd,types,Xsd,Types,我有一些我无法控制的XML文档。它们的结构定义良好,但在一系列PDF中进行了描述,这些PDF尽管非常精确,但无法使自动验证变得非常容易处理。我正在尝试编写一个XML模式,以使(大部分)这些PDF中的规则可执行 所有要素都是强制性的。但其中大约一半可以是空的,也可以是简单类型的内容 在为这些元素定义数据类型时,我为每个元素定义了两个版本:一个是“普通”版本,另一个可以为空。为此,我使用空数据类型定义联合: <xs:simpleType name="empty"> <xs:re
空数据类型定义联合:
<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>
有没有一种重复性较低的方法呢?您可以使用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" />
这对于非字符串类型(例如datetime等)非常有用,因为对于字符串,您可以只使用零长度
<OptionalString />
很遗憾,您需要在文档上指定“nil”属性。据我所知,实现您想要的唯一非侵入性方法是您已经选择的联合类型方法。是的,字符串示例很愚蠢。。。我把它改成了一个更有意义的答案(这并不会使你的答案无效)。我必须在文档中使用xsi:nil
?我无法更改文档:(@Martinho:很遗憾,是的,您也需要在文档上指定“nil”。好吧,唯一非侵入性的方法是您已经选择的联合类型方法。哦,糟糕。我将继续创建联合。我将把问题保留一段时间,以确保:)无论如何,谢谢,我不知道nillable的事。也看看哪一个也有同样的解释