2013-12-13 79 views
1

我正在嘗試爲接受圖像的服務器編寫XML架構。圖像應該全部有一個面具或沒有應該。具有相同元素的XML架構子代

我想產生這樣的XML:

<?xml version="1.0" encoding="utf-8"?> 
<FIVR> 
    <meal> 
    <media> 
     <image2D filename="filename1"> 
     <mask filename="filename1" /> 
     </image2D> 
     <image2D filename="filename2"> 
     <mask filename="filename1" /> 
     </image2D> 
     <image2D filename="filename3"> 
      <mask filename="filename1" /> 
     </image2D> 
     <image2D filename="filename4"> 
      <mask filename="filename1" /> 
     </image2D> 
     <image2D filename="filename5"> 
     <mask filename="filename1" /> 
     </image2D> 
    </media> 
    </meal> 
</FIVR> 

<?xml version="1.0" encoding="utf-8"?> 
<FIVR> 
    <meal> 
    <media> 
     <image2D filename="filename1"> 
     </image2D> 
     <image2D filename="filename2"> 
     </image2D> 
     <image2D filename="filename3"> 
     </image2D> 
     <image2D filename="filename4"> 
     </image2D> 
     <image2D filename="filename5"> 
     </image2D> 
    </media> 
    </meal> 
</FIVR> 

但是,如果一些image2D元素有一個面具子元素,但別人不,驗證應該失敗。例如,應拒絕以下內容:

<?xml version="1.0" encoding="utf-8"?> 
<FIVR> 
    <meal> 
    <media> 
     <image2D filename="filename1"> 
     </image2D> 
     <image2D filename="filename2"> 
     <mask filename="filename1" /> 
     </image2D> 
     <image2D filename="filename3"> 
      <mask filename="filename1" /> 
     </image2D> 
     <image2D filename="filename4"> 
     </image2D> 
     <image2D filename="filename5"> 
     </image2D> 
    </media> 
    </meal> 
</FIVR> 

我可以使用XSD模式來表達它嗎?

架構我已經現在看起來是這樣的:

<xs:element name="FIVR"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element name="meal" minOccurs="1" maxOccurs="1"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="media" minOccurs="1" maxOccurs="1"> 
      <xs:complexType> 
       <xs:choice> 
       <xs:element name="image2D" minOccurs="5" maxOccurs="5" > 
        <xs:complexType> 
        <xs:all minOccurs="0"> 
         <xs:element name="mask"> 
         <xs:complexType> 
          <xs:attribute name="filename" type="xs:string" use="required"/> 
         </xs:complexType> 
         </xs:element> 
        </xs:all> 
        <xs:attribute name="filename" type="xs:string" use="required"/> 
        </xs:complexType> 
       </xs:element> 
       </xs:choice> 
      </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 

回答

2

一個簡單的解決方案是將媒體聲明爲一系列無掩碼圖像或一組帶有蒙版的圖像。由於這兩種風格的圖像具有不同的驗證行爲,如果您給它們不同的名稱,這是最簡單的。然後內容模型變得像

<xs:choice> 
    <xs:element ref="image2D-mask" maxOccurs="unbounded"/> 
    <xs:element ref="image2D-nomask" maxOccurs="unbounded"/> 
</xs:choice> 

你的困難的根源是希望爲兩個不同的東西使用相同的名稱。

+1

如果OP有以這種方式重新設計的餘地,我更喜歡這種方法,而不是我的Schema 1.1'xs:assert'答案。 +1 – kjhughes

+0

同意,這是我的一個概念性錯誤 –

1

如果你正在使用XML Schema 1.1,您可以通過XPath 2.0中使用specify co-occurrence constraintsxs:assert這種(未經測試):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="my/sample/namespace" 
      xmlns="my/sample/namespace" 
      elementFormDefault="qualified"> 
    <xs:element name="FIVR"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="meal" minOccurs="1" maxOccurs="1"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="media" minOccurs="1" maxOccurs="1"> 
       <xs:complexType> 
        <xs:choice> 
        <xs:element name="image2D" minOccurs="5" maxOccurs="5" > 
         <xs:complexType> 
         <xs:all minOccurs="0"> 
          <xs:element name="mask"> 
          <xs:complexType> 
           <xs:attribute name="filename" type="xs:string" use="required"/> 
          </xs:complexType> 
          </xs:element> 
         </xs:all> 
         <xs:attribute name="filename" type="xs:string" use="required"/> 
         </xs:complexType> 
        </xs:element> 
        </xs:choice> 
        <xs:assert test="(count(image2D/mask) = 0) or (count(image2D/mask) = count(image2D))"/> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

如果你正在使用XML Schema 1.0,Y您無法在模式中表達這樣的約束,但您可以使用Schematron或在應用程序級別檢查它。

相關問題