XSD用于一个XML元素名称但在同一父元素中具有不同的属性?

时间:2016-09-23 10:56:54

标签: xml xsd xsd-validation xml-validation

这是XML:

<lists>
   <list refname="list_refname"/>
   <list refname="list_refname_template_1" use_for="template_1"/>
   <list refname="list_refname_template_2" use_for="template_2"/>
   <list refname="list_refname_template_3" use_for="template_3"/>
</lists>

和XSD:

<xsd:element name="lists">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="list" minOccurs="1" maxOccurs="1">
                <xsd:complexType>
                  <xsd:attribute name="refname" type="xsd:string" use="required"/>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="list" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>
                  <xsd:attribute name="refname" type="xsd:string" use="required"/>
                  <xsd:attribute name="use_for" type="xsd:string" use="required"/>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

这个想法是:

    只有属性refname
  • 列表元素必须只出现一次
  • 列出具有refnameuse_for might属性的元素 时间或没有

在XSD内可以吗?

如果是,如何重新编写无效的XSD?

1 个答案:

答案 0 :(得分:0)

XSD具有Element Declarations Consistent约束,要求内容模型中的相同命名元素具有一致的内容模型。您的urls = [ 'a.com/1', 'a.com/2', 'a.com/3', 'b.com/1', 'b.com/2', 'b.com/3', ] 元素在list内容模型中包含两个不同的内容模型,从而违反了此约束。

分辨率可采用以下形式之一:

  1. 重命名其中一个lists元素。
  2. 删除两个不一致的list内容模型之间的兄弟关系。
  3. 使用list元素的最一般声明。如果使用XSD 1.0,则放弃对属性的附加约束;如果使用XSD 1.1,请使用list指定属性的附加约束。