用于混合通用和特定内容的XML Schema

时间:2012-12-04 10:08:13

标签: xml xsd

是否可以将以下XML文档类表示为XML模式:

  • 根元素“root”恰好包含一个元素“message”
  • 作为第一个子元素
  • 随后,可能会跟随任意进一步的子元素,但没有进一步的“消息”元素

示例实例:

<root>
  <message type="S">Order saved</message>
  <order number="4711"/>
</root>


<root>
  <message type="S">3 countries selected</message>
  <country value="ES">Spain</country>
  <country value="FR">France</country>
  <country value="IT">Italy</country>
</root>

我的想法是使用一个xs:elementxs:any的序列,如下所示:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="message" maxOccurs="1">
           <xs:complexType>
             <xs:simpleContent>
               <xs:extension base="xs:string">
                 <xs:attribute name="type"></xs:attribute>
               </xs:extension>
             </xs:simpleContent>
           </xs:complexType>
        </xs:element>
        <xs:any processContents="skip" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

但是,包含两个“消息”子项的文档将会通过(因为第二个“message”元素将符合xs:any)。

1 个答案:

答案 0 :(得分:1)

您可以约束与xs:any匹配的元素名称。在XSD 1.0中,您可以说明了哪些名称空间被接受,在XSD 1.1中您可以更具体:实际上有一个显式关键字notQName =“## definedSibling”,它完全符合您的要求。 Saxon和Xerces目前支持XSD 1.1。