2009-08-07 64 views
0

是否有可能使用XSD將節點名稱重新枚舉爲枚舉,然後基於此枚舉添加其他限制?XSD限制

在例子中,我有這樣的XML:

<a> 
    <b name="string" value="hello"> 
    <b name="integer" value="123"> 
</a> 

我想 「B」 的節點具有枚舉名稱的屬性{ 「串」, 「整數」}。 然後,如果它是「字符串」,我希望那個「值」屬性是類型的xs:字符串, ,如果它是「整數」,我希望這個「值」屬性是類型的xs:整數。

回答

1

不,你不能在XSD中做到這一點。本質上,你有不同類型的b> 2 < b> s。這違反了Element Consistency rule

您有幾種選擇,

  1. 執行規則的架構之外,在應用程序中。這是我會做的。
  2. 使用像Schematron這樣的驗證語言,如其他人所述。
  3. 切換到更強大的模式語言,如Relax NG
+0

就像我一樣。感謝您的回答。 – ppiotrowicz 2009-08-07 11:13:58

1

你可以做一定的限制,例如你可以限制你的name屬性的值來自給定的列表 - 但是你不能在XML模式中表示「如果name是字符串,那麼值的類型必須是xs:string」之間的這種關係。

您必須使用其他一些技術(如Schematron),或者在您的應用程序代碼中進行檢查。

馬克

+0

感謝您的回覆。我會更接近schematron。 – ppiotrowicz 2009-08-07 09:24:08

0

不可以,但你喜歡一個類型的治療名字 - 和XML Schema 確實有一個元素的complexType由一個字符串值,來確定一定的支持。但是,你必須使用屬性名稱:你的XML文檔中的「XSI型」,所以它看起來像這樣:

<a> 
    <b xsi:type="string" value="hello"> 
    <b xsi:type="integer" value="123"> 
</a> 

這是XML模式可以做的恐怕是最好的。更多的細節在官方的引物(這可能是很令人困惑,不幸): http://www.w3.org/TR/xmlschema-0/#UseDerivInInstDocs