如何指定"任何元素"在序列中

时间:2014-12-11 22:02:35

标签: xsd xsd-validation

有人能告诉我如何在XSD中指定一个元素可以包含任意数量的任意元素吗?例如,如果我有

<person>
    <name>Foo</name>
</person>

我想在“<name>”元素之后允许任何元素。

<person>
    <name>Foo</name>
    <gender>male</gender>
</person>

<person>
    <name>Foo</name>
    <address>west of here</address>
</person>

<person>
    <name>Foo</name>
    <address>west of here</address>
    <spooge>something else</spooge>
</person>

也就是说,name元素是必需的,但之后,您可以添加任何类型的任意元素。因此,如果这是描述<person>元素的XSD元素,那么“<xs:element name='name' .../>”后面会有什么

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

2 个答案:

答案 0 :(得分:4)

您可以使用xsd:any

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           version="1.0">
  <xs:element name="person">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="name" type="xs:string"/>
        <xs:any processContents="skip" namespace="##any"
                minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

要特别注意processContent的可能值:

  • 跳过:允许任何元素,并忽略该元素的任何定义。
  • lax :允许任何元素,但如果找到任何定义,则验证该元素。
  • 严格:允许任何元素,但要求它具有定义并且对于该定义有效。

答案 1 :(得分:0)

我的解决方案是:

<xs:complexType name="dataType">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:anyAttribute processContents="skip"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>
  

我的IDE(PHPStorm)运行错误xs:any但支持xs:anyAttribute