我希望有一个以子级祖先类型为条件的后代元素。是否可以在xml架构1.0中建模该关系?如果是这样,怎么样?
以下是我想要的结构/验证行为:
<a1>
<b>
<c>
<d/> -- allowed if ancestor is a1
</c>
</b>
</a1>
<a2>
<b>
<c>
<d/> -- validation error - not allowed if ancestor is not a1
</c>
</b>
</a2>
似乎XSD 1.1断言可以让我做到这一点,但我坚持使用XML Schema 1.0。
我显然可以创建并行层次结构,并且只允许在一个元素中使用d元素,但对于我们的模式用户来说,这会变得冗长和混乱。
并行层次结构可能如下所示:
<a1>
<b1>
<c1>
<d/> -- allowed in c1 element
</c1>
</b1>
</a1>
<a2>
<b2>
<c2>
<d/> -- not allowed in c2
</c2>
</b2>
</a2>
编辑:使用CM提示的上述问题的解决方案架构
<xs:element name="a1">
<xs:complexType>
<xs:sequence>
<xs:element name="b" type="b1"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="a2">
<xs:complexType>
<xs:sequence>
<xs:element name="b" type="b2"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="b1">
<xs:sequence>
<xs:element name="c" type="c1"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="b2">
<xs:sequence>
<xs:element name="c" type="c2"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="c1">
<xs:sequence>
<xs:element name="d"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="c2">
<xs:sequence>
</xs:sequence>
</xs:complexType>
答案 0 :(得分:1)
是的,这是可能的。你的并行元素层次结构的后备提议(如果你在a1,b2和c2,如果你在a2中,则为b1和c1)已经在那里。您想要的基本上是相同的并行层次结构,但进一步扭曲的是您称为b1和b2的元素都被称为b(对于c1,c2,c类似)。
关键是在a1的上下文中将名称“b”绑定到一个类型的元素(称为B1),并在a2的上下文中将其绑定到不同的类型(B2)。然后,名称“c”在类型B1的上下文中绑定到一种类型(C1),在类型B2的上下文中绑定到不同类型(C2)。在C1类型中,允许使用d个元素,而不是C2类型。
可以在a paper I wrote while XSD 1.0 was being developed中找到有关该技术的更全面描述。可以观察到,相同的技术可以应用于任何模式语言,其中名称/类型绑定可以是给定上下文的本地;例如,放松NG可以做同样的事情。