2013-12-13 42 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或在应用程序级别检查它。

相关问题