如何使用 XML 模式允许输入的值为空?
我有一些我无法控制的 XML 文档。它们的结构定义明确,但在一堆 PDF 中进行了描述,尽管这些 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>
是否有一种重复性较低的方法来执行此操作?
I have some XML documents over which I have no control whatsoever. Their structure is well-defined, but it is described in a bunch of PDFs, which, despite being very exact, don't make automated validation very tractable. I'm trying to write a XML schema to make (most of) the rules in those PDFs executable.
All the elements are mandatory. But about half of them can be either empty or have simple typed content.
When defining datatypes for these elements, I defined two versions of each: a "normal" one, and another that can be empty. I did this by defining unions with an empty
datatype:
<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>
Is there a less repetitive way of doing this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以使用 xs:nillable。
在 XSD 中
在文档中
这对于非字符串类型(例如日期时间等)最有用,因为对于字符串,您可以只使用零长度。
不幸的是,您需要在文档上指定“nil”属性。据我所知,执行您想要的操作的唯一非侵入性方法是您已经选择的联合类型方法。
You can use xs:nillable.
In XSD
In Document
This is most useful for non-string types (e.g. datetime etc) as for strings you could just use zero length.
Unfortunately you need to specify the "nil" attribute on the document. As far as I know, the only non-intrusive way to do what you want is the union type approach that you've already chosen.