[XML] 讓 XML schema 允許 XML 中的元素多次出現、且順序不固定

[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?

(本頁面已被瀏覽過 62 次)

發表迴響

你的電子郵件位址並不會被公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料