【问题标题】:Control element cardinality based on an attribute enumeration in XSD?基于XSD中的属性枚举的控制元素基数?
【发布时间】:2016-05-10 01:16:28
【问题描述】:

如果cell @type 是fillednumberedspecialNumberedspecialUnnumbered,我希望character 元素是可重复的。如果cell @type 是multiCharacterNumberedmultiCharacterUnnumbered,我希望character 元素不可重复。

如果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>

【问题讨论】:

    标签: xml xsd xsd-validation xml-validation


    【解决方案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>
    

    【讨论】:

    • 这很好。当@typeblack 时,我还将如何禁止@number?我尝试使用test="@type='black' and not@number",但没有奏效。 @number = 0 也没有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2022-01-23
    • 2019-03-23
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    相关资源
    最近更新 更多