2009-06-22 71 views
0

我有通過XML傳輸的對象的層次結構。通過指出哪個元素可能包含哪些子元素,層次結構規則在XML Schema中很容易表達。 XML數據的simplifed例子是(實際的對象數據被包含在屬性和爲了簡潔省略):我可以在XML模式中表達「可能/不可以包含」跨越多個級別的規則嗎?

<root> 
    <channel> 
    <router> 
     <message /> 
     <message /> 
     <message /> 
    </router> 
    <router> 
     <message /> 
     <message /> 
    </router> 
    </channel> 
    <channel></channel> 
</root> 

現在我想介紹「的文件夾」,也就是即這些節點只是用來構造較長的兒童列表以便於使用。如果我製作一個通用的<folder>元素,它不會強加它自己的規則,而是從樹中的下一個非文件夾元素繼承它們。

在我看來,我無法在XSD中表達,或者我可以嗎?

我可以考慮替代方案,比如爲每個可能的規則(醜陋)設置特定的文件夾元素,僅僅忽略XSD中的規則並在代碼中強制執行它們(罰款),或者以某種方式分離XML中的對象層次結構和中間節點(不太確定如何)。如果您有任何問題,我也會很感激您的意見。

回答

1

你說得對,你想要什麼都不能用XSD表達。儘管可以引入單層文件夾,或者更普遍的是n層文件夾,但不是任意遞歸的文件夾(因爲那些文件夾必須是全局元素,然後它們不會知道它們包含在)。

可能在Schematron中表達這樣的約束;反過來,可以將schematron約束嵌入到XSD appinfo元素中。您的驗證器可能支持也可能不支持XSD中嵌入的Schematron。

相關問題