Xsd 如何使用XML模式允许类型化值为空?

Xsd 如何使用XML模式允许类型化值为空?,xsd,types,Xsd,Types,我有一些我无法控制的XML文档。它们的结构定义良好,但在一系列PDF中进行了描述,这些PDF尽管非常精确,但无法使自动验证变得非常容易处理。我正在尝试编写一个XML模式,以使(大部分)这些PDF中的规则可执行 所有要素都是强制性的。但其中大约一半可以是空的,也可以是简单类型的内容 在为这些元素定义数据类型时,我为每个元素定义了两个版本:一个是“普通”版本,另一个可以为空。为此,我使用空数据类型定义联合: <xs:simpleType name="empty"> <xs:re

我有一些我无法控制的XML文档。它们的结构定义良好,但在一系列PDF中进行了描述,这些PDF尽管非常精确,但无法使自动验证变得非常容易处理。我正在尝试编写一个XML模式,以使(大部分)这些PDF中的规则可执行

所有要素都是强制性的。但其中大约一半可以是空的,也可以是简单类型的内容

在为这些元素定义数据类型时,我为每个元素定义了两个版本:一个是“普通”版本,另一个可以为空。为此,我使用
空数据类型定义联合:

<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的事。也看看哪一个也有同样的解释