使用属性值检查XSD元素中的顺序

时间:2013-09-19 10:24:56

标签: xml xsd xsd-validation

我有以下格式的xml

<abc>
  <xyz name="all">
    <last a="1" b="2"></last>
    <last a="1" b="2"></last>
  </xyz>
  <xyz name="el">
    <last a="1" b="2"></last>
    <last a="1" b="2"></last>
  </xyz>
  <xyz name="els">
    <last a="1" b="2"></last>
    <last a="1" b="2"></last>
  </xyz>
</abc>

为此,我写了一个像这样的xsd

<xsd:element name="abc" type="abcType" />
  <xsd:complexType name="abcType">
    <xsd:sequence>
      <xsd:element maxOccurs="unbounded" name="xyz" type="xyzType" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="xyzType">
    <xsd:sequence>
      -----
    </xsd:sequence>
    <xsd:attribute name="name" type="xsdLocal:nameType" use="required"/>
  </xsd:complexType>
  <xsd:simpleType name="nameType">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="ALL|[a-z]*"/>
    </xsd:restriction>
 </xsd:simpleType>

但我的问题是如何检查“xyz”与“name”属性值“all”总是先来且是可选的。

请帮助...提前致谢。

1 个答案:

答案 0 :(得分:1)

  

但我的问题是如何检查“xyz”与“name”属性值“all”总是先来且是可选的。

您无法使用XSD 1.0执行此操作。为复杂类型定义的语法仅通过元素名称而不是通过其内容来约束序列中的元素,并且对于具有相同名称的两个兄弟元素,元素内容的规则不能不同。

当然,您可以使用XSD 1.1断言来完成此操作。例如,在assert="not(xyz[@name='all']/preceding-sibling::*)"形式的包含abc元素级别的约束。

XSD 1.1目前仅在Saxon和Xerces中实施。