[XML] 讓 XML schema 允許 XML 中的元素多次出現、且順序不固定
最近在弄專案的 XML、XSLT 以及 XML schema~
原本在 <event> 裡面只會有 <keyword>,
我想在裡面多加一個 <except> 的 element:
<event> <keyword>Run</keyword> <except>Pause</except> <keyword>Stop</keyword> </event>
一加上去之後,原本寫好的 XML Schema (XSD) 就驗證失敗了…
這是原本的 XSD 寫法,基本上是要求 event 裡有一個以上的 keyword:
<xsd:element name="event" minOccurs="1" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element type="xsd:string" name="keyword" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element>
如果直接把我新加的 except 加在 XSD 裡面,
語意會是「在一個以上的 keyword 之後,會有一個以上的 except」:
<xsd:element name="event" minOccurs="1" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element type="xsd:string" name="keyword" minOccurs="1" maxOccurs="unbounded"/> <xsd:element type="xsd:string" name="except" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element>
但這並不是我想要的,
我想要的是「event 裡有一個以上的 keyword 或 except,而且順序可以隨意穿插」~
這樣的話,XSD 要怎麼寫呢?
在網路上查了一下,找到了以下的解法:
<xsd:element name="event" minOccurs="1" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:choice minOccurs="1" maxOccurs="unbounded"> <xsd:element type="xsd:string" name="keyword"/> <xsd:element type="xsd:string" name="except"/> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:element>
這個解法就是加上一個 <xsd:choice> 並且將它設定成「一個以上」,
而 <xsd:choice> 裡面可以任選 keyword 或 except 其一,
這樣最後的效果也就是「有一個以上的 keyword 或 except,且順序隨意」了~
參考資料:XSD – how to allow elements in any order any number of times?
(本頁面已被瀏覽過 1,464 次)