2009-06-09 114 views
4

是否可以使用以下行爲創建XML模式?我有一個如下所示的XML文件。我想根據Type的值來公開或限制Object的屬性。例如,如果Type =「Bike」,我可能想要公開僅與自行車相關的屬性(即踏板,框架等)。如果Type =「Car」,我可能想要公開僅與Car有關的屬性(即Make,Model,Miles等)。允許/限制基於其他屬性的XML屬性

<Objects> 
    <Object Type="Bike" Pedals="XXX" Frame="XXX" /> 
    <Object Type="Car" Make="XXX" Model="XXX" Miles="XXX" /> 
</Objects> 

在此先感謝您的幫助。如果您有任何問題,請告訴我。

回答

4

我的理解是,這超出了你可以用xsd做的事情。此外,它使查詢噩夢。首選的方法(如果可能的話)是使用:

<vehicles> 
    <bike pedals="XXX" frame="XXX" /> 
    <car make="XXX" model="XXX" miles="XXX" /> 
</vehicles> 

carbike大概有一個共同的根vehicle在XSD,而是自己特定的屬性(上繼承者的頂部)。

+1

我不確定是否存在任何技術因素,爲什麼這是不可能的 - 這絕對是正確的方法,甚至W3C專門解決了這個問題,儘管我正在努力尋找文檔。 – annakata 2009-06-09 13:52:08

+0

由「如果可能」,我的意思是「爲你的情況」; -p – 2009-06-09 13:58:15

2

我認爲你會把太多東西塞進屬性中。像踏板和框架應該可能是元素。

0

我同意Marc你試圖做的事情不在W3C XML-Schema的能力範圍之內。我也同意你的數據模型只是有點超載/模棱兩可有用。但是,如果您在此問題上沒有選擇,那麼SchematronRelax-NG可能會提供可行的解決方案。

0

是的,你只需要使用xsi:type,而不是Type的XSD多態性(和模式,推導出類型從普通型):

<Objects> 
    <Object xsi:type="Bike" Pedals="XXX" Frame="XXX" /> 
    <Object xsi:type="Car" Make="XXX" Model="XXX" Miles="XXX" /> 
</Objects> 

有關詳細信息,請參閱XML Schema Part 0: Primer。它有一個example schema這一點,其中校舍地址UKAddress類型從地址的。再往下是使用xsi:typeexample instance