2016-05-10 70 views
1

如果cell @type为fillednumberedspecialNumberedspecialUnnumbered,我希望character元素是可重复的。如果cell @type为multiCharacterNumberedmultiCharacterUnnumbered,我希望character元素不可重复。基于XSD中的属性枚举的控件元素基数?

如果cell类型是blank,我想完全禁止character元素。

这是否需要XSD 1.1?我如何形成条件或测试?

<xs:element name="cell" maxOccurs="unbounded"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="character" type="xs:string" minOccurs="0"/> 
     </xs:sequence> 
     <xs:attribute name="type" use="required"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:enumeration value="filled"/> 
         <xs:enumeration value="blank"/> 
         <xs:enumeration value="numbered"/> 
         <xs:enumeration value="specialNumbered"/> 
         <xs:enumeration value="specialUnnumbered"/> 
         <xs:enumeration value="multiCharacterNumbered"/> 
         <xs:enumeration value="multiCharacterUnnumbered"/> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:attribute> 
     </xs:complexType> 
    </xs:element> 

回答

1

是,XSD 1.1(不XSD 1.0)可以表达你的复杂的约束条件:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
      vc:minVersion="1.1"> 
    <xs:element name="cell"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="character" type="xs:string" 
        minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
     <xs:attribute name="type" use="required"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
      <xs:enumeration value="filled"/> 
      <xs:enumeration value="blank"/> 
      <xs:enumeration value="numbered"/> 
      <xs:enumeration value="specialNumbered"/> 
      <xs:enumeration value="specialUnnumbered"/> 
      <xs:enumeration value="multiCharacterNumbered"/> 
      <xs:enumeration value="multiCharacterUnnumbered"/> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:attribute> 
     <xs:assert test="( (@type = 'blank' and count(character) = 0) 
         or (@type = ('multiCharacterNumbered', 'numbered', 
            'specialNumbered', 'specialUnnumbered') 
          and count(character) = (0,1)) 
         or (@type = ('filled', 'multiCharacterUnnumbered')))"/> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

这是一件好事。当@type'是'black'时,我怎么也禁止'@ number'?我尝试使用'test =“@ type ='black'而不是@ number”'但它不起作用。 '@数字= 0'也没有工作。 – Misenus