gpt4 book ai didi

xml - 定义一个 XSD 元素,它可以是日期时间或带有属性的空元素

转载 作者:数据小太阳 更新时间:2023-10-29 01:47:12 27 4
gpt4 key购买 nike

我的问题和this one几乎一模一样,但对于 xs:dateTime 类型而不是用户定义的元素。

我的 XML 中的元素(不是我创建的)可能如下所示:

<parent>
...
<start>2012-01-01T00:00:00.000</start>
<end>2013-01-01T00:00:00.000</end>
...
</parent>

-或-

<parent>
...
<start reference="a string" />
<end reference="a string" />
...
</parent>

换句话说,在父元素中,“开始”和“结束”字段可以包含 xs:dateTime 值,或者为空但具有“引用”属性(任一字段可能是其中之一在父级中,它们不一定都是引用或都是日期时间)。我已经尝试了各种方法来在 XSD 中表示它,但还没有找到解决方案。我最接近的是(摘自更大的 XSD):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="DateOrRef">
<xs:simpleContent>
<!-- <xs:extension base="xs:dateTime"> This does not validate-->
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="reference" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="parent">
<xs:sequence>
<xs:element minOccurs="0" name="start" type="DateOrRef" />
<xs:element minOccurs="0" name="end" type="DateOrRef" />
</xs:sequence>
</xs:complexType>
</xs:schema>

它会验证,但不会将节点内容限制为 xs:dateTime 值。如果我将扩展基本类型更改为 xs:dateTime 而不是注释行中的 xs:string,空元素将不再有效,因为 dateTime 类型不允许为空。

我如何构造 XSD 以将这些字段验证为 xs:dateTime 而不是 xs:string?

最佳答案

1 您可以将元素声明为 nillable(按照 Ben 的建议)。

2 您可以声明一个简单类型,它是 xs:dateTime 和空字符串的联合。如果我们分阶段构建它,这是最容易遵循的。首先,声明一个命名的简单类型,其唯一值为空字符串:

<xs:simpleType name="empty-string">
<xs:restriction base="xs:string">
<xs:enumeration value=""/>
</xs:restriction>
</xs:simpleType>

然后声明一个联合类型,它的成员是xs:dateTime和empty-string:

<xs:simpleType name="dateTime-or-nothing">
<xs:union memberTypes="xs:dateTime empty-string"/>
</xs:simpleType>

然后使用 dateTime-or-nothing 作为扩展步骤的基础:

<xs:complexType name="DateOrRef">
<xs:simpleContent>
<xs:extension base="dateTime-or-nothing">
<xs:attribute type="xs:string"
name="reference"
use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>

如果引用属性当且仅当元素没有内容时才会出现,那么您将需要一个 XSD 1.1 断言来实现这种效果(或辅助 Schematron 模式,或应用层的临时验证代码)。 XSD 内容模型可以很容易地说明您必须具有日期时间或引用,但前提是这些选项中的每一个都由子元素表示。

关于xml - 定义一个 XSD 元素,它可以是日期时间或带有属性的空元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18796258/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com