在XML Schema复杂类型中,限制如何影响允许属性的集合?

时间:2014-06-18 18:19:44

标签: xml xsd

因此,使用XML Schema限制,您可以派生出一个新的复杂类型,该类型具有父类型的元素子集。例如,如果我有这种基本类型:

<complexType name="baseType">
  <complexContent>
    <restriction base="anyType">
      <attribute name="number" type="decimal"/>
      <attribute name="quantity" type="positiveInteger"/>
      <sequence>
        <element name="first" minOccurs="0" maxOccurs="1" type="string"/>
        <element name="second" minOccurs="0" maxOccurs="1" type="string"/>
      </sequence>
    </restriction>
  </complexContent>
</complexType>

并创建以下新类型:

<complexType name="newType">
  <complexContent>
    <restriction base="anyType">
      <attribute name="number" type="decimal"/>
      <sequence>
        <element name="first" type="string"/>
      </sequence>
    </restriction>
  </complexContent>
</complexType>

我的问题是新类型允许哪些属性和元素?只有numberfirstfirst元素的限制是什么?默认(minOccurs="1" maxOccurs="1")或来自父(minOccurs="0" maxOccurs="1")?

如果我有其他类型:

<complexType name="newType2">
  <complexContent>
    <restriction base="anyType">
      <sequence>
        <element name="first" type="string"/>
      </sequence>
    </restriction>
  </complexContent>
</complexType>

这里允许哪些属性?

1 个答案:

答案 0 :(得分:1)

在限制中,您必须包含您希望在新类型中允许的基本类型中声明的集合中的所有元素和属性。限制中的元素声明将覆盖之前的元素声明。

您的架构几乎是正确的。在complexType元素中,sequence必须出现在attribute声明之前。如果你有这个架构:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
        elementFormDefault="qualified" targetNamespace="tns" xmlns:tns="tns">

    <complexType name="baseType">
        <complexContent>
            <restriction base="anyType">
                <sequence>
                    <element name="first" minOccurs="0" maxOccurs="1" type="string"/>
                    <element name="second" minOccurs="0" maxOccurs="1" type="string"/>
                </sequence>
                <attribute name="number" type="decimal"/>
                <attribute name="quantity" type="positiveInteger"/>
            </restriction>
        </complexContent>
    </complexType>

    <complexType name="newType">
        <complexContent>
            <restriction base="tns:baseType"> <!-- restriction of baseType -->
                <sequence>
                    <element name="first" type="string"/>
                </sequence>
                <!-- attribute declarations are not necessary, since they allow the same types -->
            </restriction>
        </complexContent>
    </complexType>

    <element name="root">
        <complexType>
            <choice maxOccurs="unbounded">
                <element name="base" type="tns:baseType" minOccurs="0"/>
                <element name="new"  type="tns:newType" minOccurs="0"/>
            </choice>
        </complexType>
    </element>

</schema>

它将验证两个第一个<base>元素,但由于注释中说明的原因,将在两个<new>元素中验证失败:

<base number="123.5" quantity="3"> <!-- will validate -->
    <first></first>
    <second></second>
</base>

<base> <!-- will validate: min occurs for <first> and <second> is zero OK --> 
</base>

<new number="123.5"> <!-- will fail validation: min occurs of <first> is one -->
</new>

<new number="123.5" quantity="3"> <!-- will validate: quantity attribute is inherited -->
    <first></first>
    <second></second> <!-- will fail validation: no <second> element allowed -->
</new>

派生类型中的元素和属性声明必须等于或大于限制:您不能在派生类型中使用:

<element name="first" minOccurs="0" maxOccurs="unbounded" type="string"/>

因为在基类型中没有明确的maxOccurs所以值为1,而unbounded不是限制。此外,如果您将属性声明为decimal,例如,在基本类型中,您可以再次将其声明为integer以对其进行更多限制,但您无法声明最初为{{1}的属性} integer因为那不是限制