2015-02-10 59 views
2

鑑於以下XML:XML架構二級鍵/ keyref約束

<root> 
    <families> 
    <family familyname="Flintstone"> 
     <member name="Fred"/> 
     <member name="Wilma"/> 
    </family> 
    <family familyname="Rubble"> 
     <member name="Barney"/> 
     <member name="Betty"/> 
     <member name="Bamm-Bamm"/> 
    </family> 
    </families> 
    <employees> 
    <employee name="Fred" familyname="Flintstone"/> 
    <employees> 
</root> 

是否有可能建立在XSD鍵/ keyref約束驗證empployee的有效性?

以下的鍵不起作用(在keyref是straigt前鋒):

<xs:key name="Individuals"> 
    <xs:selector xpath="./families/family/member"/> 
    <xs:field xpath="@name"/> 
    <xs:field xpath="../@familyname"/> 
</xs:key> 

是否有一個有效的替代?

回答

0

不,這是不可能的,如上所述。我認爲「有效的替代方案」就是實現你的意圖的方案,即使它涉及對XML的更改。

在這種情況下,只需向成員(@key作爲示例)添加一個新的強制屬性即可。這意味着你應該從員工中刪除姓名+家族姓名,然後添加密鑰。

它會感覺更像是一個 「數據庫」 ...優點:

  • 更小的尺寸
  • 標準化設計
  • 鍵/ keyref容易做到的畢竟
  • ,familyname +成員/ @名稱並不總是唯一的。用鑰匙,你不會有這個問題,因爲你真的確定一個成員(不是一個人,因爲同一個人可能涉及兩個不同的家庭,兒子在一個,丈夫在另一個)。

我意識到你的插圖是一個真實世界場景的模型,因此我的最後的好處可能與你的真實情況無關。不過,這是應該適用的那種思維。