代码之家  ›  专栏  ›  技术社区  ›  Alexander Kjäll

对XML模式中的元素同时具有属性和限制

xsd
  •  23
  • Alexander Kjäll  · 技术社区  · 15 年前

    我正在尝试编写一个XML模式来验证这段XML:

    <date isodate="2007-03-14">14 march 2007</date>
    

    属性isodate的类型应设置为xs:date,内容最长应为50个字符。

    我想知道是否可以在一个块中编写XML模式定义,如下所示:

    <xs:element name="date" minOccurs="0" maxOccurs="1">  
      <xs:complexType>  
        <xs:simpleContent>  
          <xs:restriction base="xs:string">  
            <xs:minLength value="0"/>  
            <xs:maxLength value="50"/>  
          </xs:restriction>  
          <xs:attribute name="isodate" type="xs:date" use="required"/>  
        </xs:simpleContent>  
      </xs:complexType>  
    </xs:element>
    

    上面的代码不起作用,我也不知道为什么。我找到的唯一解决方法是将限制部分分解成单独的类型,并像这样链接:

    <xs:simpleType name="reviewDate">  
        <xs:restriction base="xs:string">  
            <xs:minLength value="0"/>  
            <xs:maxLength value="50"/>  
        </xs:restriction>  
    </xs:simpleType>
    
    <xs:element name="date" minOccurs="0" maxOccurs="1">  
        <xs:complexType>  
            <xs:simpleContent>  
                <xs:extension base="reviewDate">  
                    <xs:attribute name="isodate" type="xs:date" use="required"/>  
                </xs:extension>  
            </xs:simpleContent>  
        </xs:complexType>  
    </xs:element>
    

    我的问题是如何在一个块中编写定义,以便模式更易于阅读,并且不引用模式其他部分中的类型。

    2 回复  |  直到 7 年前
        1
  •  16
  •   marc_s HarisH Sharma    15 年前

    不能将限制和扩展合并到一个XSD块中。“reviewdate”简单类型的解决方案是我所知道的最好的解决方案。

    马克

        2
  •  0
  •   Ignas    7 年前

    您可以有一个具有限制和属性的元素(-s)。 关键是用它的限制定义自定义类型,然后使用它向它添加属性。 参考这里: Content restriction and attribute validation on the same element in XSD