2013-01-15 51 views
2

我想有一個後代元素的條件在頂級祖先類型。是否有可能在xml模式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模式1.0。

我明顯可以創建並行層次結構,並且只允許在一個d元素中使用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

是的,這是可能的。平行元素層次結構的回退建議(如果您位於a2中,則位於a1,b2和c2之內的b1和c1)已經到了一半。你想要的基本上是相同的平行層次結構,但隨着你稱之爲b1和b2的元素都被稱爲b(以及類似的c1,c2,c)的進一步扭曲。

關鍵是將名稱'b'綁定到a1上下文中的一種類型的元素(稱爲B1),並將其綁定到a2上下文中的另一種類型(B2)。名稱'c'然後綁定到類型B1的上下文中的一個類型(C1),以及類型B2的上下文中的不同類型(C2)。在類型C1中,允許d元素,而不是C2類型。

更詳細的技術說明可在a paper I wrote while XSD 1.0 was being developed中找到。可以觀察到,相同的技術可以應用於任何模式語言,其中名稱/類型綁定對於給定的上下文可以是本地的;放鬆NG,例如,可以做同樣的事情。

+0

完美!正是我需要的。我不明白創建上下文敏感元素的能力。在我的問題編輯中查看基於CM上面的響應的功能模式。 – user1981490