我想创建一个 XSD 文件,它可以根据其父节点的名称检查属性是否存在。知道我该怎么做吗?下面是我正在尝试做的一个例子。
Xml - AttrA 和 AttrB 是必需的,因为父节点是“A”
<A>
<B AttrA="1" AttrB="2" />
</A>
Xml - AttrB 和 AttrC 是必需的,因为父节点是“C”
<C>
<B AttrB="2" AttrC="3" />
</C>
我想创建一个 XSD 文件,它可以根据其父节点的名称检查属性是否存在。知道我该怎么做吗?下面是我正在尝试做的一个例子。
Xml - AttrA 和 AttrB 是必需的,因为父节点是“A”
<A>
<B AttrA="1" AttrB="2" />
</A>
Xml - AttrB 和 AttrC 是必需的,因为父节点是“C”
<C>
<B AttrB="2" AttrC="3" />
</C>
最简单的方法是使 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 的约束采取要求其子项具有特定形式的形式。