XSD(XML模式):元素必须还有一个子元素

时间:2011-06-30 19:13:24

标签: xml xsd

假设我有一个像这样的XML元素,我正在尝试为这个元素编写XSD:

<foo name="bar">
    ...
</foo>

此元素的规则是:

  • 它的名字是“foo”
  • 它有一个名为“bar”的属性
  • 其“bar”属性值为字符串
  • 必须有一个或多个孩子

此XSD封装了除最后一个规则之外的所有规则:

    

如何指定元素必须具有子元素的最后一条规则?

2 个答案:

答案 0 :(得分:1)

使用<xs:any>元素允许任何元素作为子内容。

符合规则的示例代码:

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="foo">
    <xs:complexType>
      <xs:sequence>
        <xs:any minOccurs="1" maxOccurs="unbounded" />
      </xs:sequence>
      <xs:attribute name="bar" type="xs:string" />
    </xs:complexType>
  </xs:element>
</xs:schema>

您可以使用namespace元素processContents<xs:any>属性来控制允许的元素和foo子元素的验证。

答案 1 :(得分:0)

如果您不知道类型名称,那么您就不走运了。 XSD中没有任何内容表示“必须有子元素”。但是,如果您乐意将子元素限制在“儿童包装器”中,那么这样的事情对您有用:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="foo">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" name="children" type="xs:anyType" />
      </xs:sequence>
      <xs:attribute name="bar" type="xs:string" />
    </xs:complexType>
  </xs:element>
</xs:schema>

当然这意味着您必须使用xs:anyType类型。