0

我想创建一个 XSD 文件,它可以根据其父节点的名称检查属性是否存在。知道我该怎么做吗?下面是我正在尝试做的一个例子。

Xml - AttrA 和 AttrB 是必需的,因为父节点是“A”

<A>
 <B AttrA="1" AttrB="2" />
</A>

Xml - AttrB 和 AttrC 是必需的,因为父节点是“C”

<C>
 <B AttrB="2" AttrC="3" />
</C>
4

1 回答 1

1

最简单的方法是使 B 的一种或两种形式局部于其父级的复杂类型。如果 A 和 C 都是顶级元素,并且我们将 B 的两种形式都设为本地,例如,您可以这样写:

<xs:element name="A">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="B" type="B-in-A"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="C">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="C" type="B-in-C"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

两种类型的 B-in-A 和 B-in-C 可以随意声明,例如

<xs:complexType name="B-in-A">
  <xs:sequence/>
  <xs:attribute name="AttrA" type="xs:integer"/>
  <xs:attribute name="AttrB" type="xs:integer"/>
</xs:complexType>

<xs:complexType name="B-in-C">
  <xs:sequence/>
  <xs:attribute name="AttrB" type="xs:integer"/>
  <xs:attribute name="AttrC" type="xs:integer"/>
</xs:complexType>

在某些情况下,您可能希望为 B 声明一个泛型类型并从中派生出两种类型 B-in-A 和 B-in-C,以便它们彼此之间具有某种遗传关系;这取决于您是否有办法利用这种推导关系。

在 XSD 1.1 中,您还可以选择使用必需的 AttrB 和可选的 AttrA 和 AttrC 声明 B,然后对 A 和 C 的类型进行断言,以检查 A 中的 B 携带 AttrA 而不是 AttrC,反之亦然对于 C 中的 B。

哪种感觉更清晰和更简单可能取决于您是否将 B 的属性差异视为 (a) B 基于其上下文的行为差异,或 (b) 对 A 和/或 C 的约束采取要求其子项具有特定形式的形式。

于 2013-02-16T01:13:46.357 回答