在XML Schema 1.0中以条件为顶级祖先的后代约束

时间:2013-01-15 19:50:15

标签: xml xsd constraints xsd-1.0

我希望有一个以子级祖先类型为条件的后代元素。是否可以在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>

1 个答案:

答案 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可以做同样的事情。