如何在XML Schema中将非字符串元素声明为具有可选内容

时间:2009-09-09 19:44:48

标签: xsd

我见过XML Schema element with attributes containing only text,但我有一个xs:dateTime的元素。

我正在尝试编写一个模式的文档,如下所示:

<web-campaigns>
  <web-campaign>
    <id>1231</id>
    <start-at nil="true"/>
  </web-campaign>
  <web-campaign>
    <id>1232</id>
    <start-at>2009-08-08T09:00:00Z</start-at>
  </web-campaign>
</web-campaigns>

有时xs:dateTime元素有内容,有时则没有。

到目前为止(尚未验证)是:

<xs:element name="start-at">
  <xs:complexType mixed="true">
    <xs:simpleContent>
      <xs:extension base="xs:dateTime">
        <xs:attribute name="nil" default="false" type="xs:boolean" use="optional" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

如果我用xs:string替换xs:dateTime,我可以很好地验证文档,但我真的想要一个xs:dateTime来向消费者表明该元素中的内容。我尝试了/不使用 mixed =“true”,但无济于事。

如果它有所不同,我使用xmllint(在Mac OS X 10.5上)和XML Schema Validator

进行验证

2 个答案:

答案 0 :(得分:4)

您可以将自己的类型定义为类型联合。

1 /将“空”类型定义为只允许“”ähm没有的字符串:)

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

2 / next定义允许日期和空

的类型
<xs:simpleType name="empty-dateTime">
  <xs:union memberTypes="xs:dateTime empty"/>
</xs:simpleType>

3 /将所有可空的日期时间元素声明为type="empty-dateTime"

答案 1 :(得分:1)

你需要

<xs:element name="start-at" minOccurs="0">

混合模式与您的情况无关,您不需要。默认情况下,minOccurs="1",即元素是必需的。

使用minOccurs =“0”,您可以指定包含内容的元素,也可以根本不指定。如果您希望能够允许<start-at/>,则不能使用xs:dateTime。