0

我有以下格式的 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>

但我的问题是如何使用“name”属性值“all”检查“xyz”始终排在第一位且是可选的。

请帮助...在此先感谢。

4

1 回答 1

1

但我的问题是如何使用“name”属性值“all”检查“xyz”始终排在第一位且是可选的。

XSD 1.0 无法做到这一点。为复杂类型定义的语法仅通过元素名称而不是内容来约束序列中的元素,并且元素内容的规则对于具有相同名称的两个兄弟元素不能有所不同。

当然,您可以使用 XSD 1.1 断言来做到这一点。例如,表单的包含 abc 元素级别的约束assert="not(xyz[@name='all']/preceding-sibling::*)"

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

于 2013-09-19T11:32:40.513 回答