如何使用 XML 模式允许输入的值为空?

发布于 2024-11-04 00:18:00 字数 771 浏览 0 评论 0原文

我有一些我无法控制的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

﹏半生如梦愿梦如真 2024-11-11 00:18:00

您可以使用 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”属性。据我所知,执行您想要的操作的唯一非侵入性方法是您已经选择的联合类型方法。

You can use xs:nillable.

In 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" />

In Document

<OptionalString xsi:nil="true" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />

This is most useful for non-string types (e.g. datetime etc) as for strings you could just use zero length.

<OptionalString /> 

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文