XSD:属性值的不同限制

时间:2014-08-14 15:29:16

标签: attributes xsd restriction

我是XSD的新手并提出以下问题,非常感谢您的帮助!

假设我有xml:

<DataGroup>
  <Data name="name">Jane</Data>
  <Data name="age">50</Data>
  <Data name="state>MA</Data>
  <Data name="zipcode">01000</Data>
</DataGroup>

我想限制: 当属性名称等于“age”时,值应为整数且> 20, 当属性名称等于“state”时,值应为两个字母。 当属性名称等于“邮政编码”时,值应为\ d {5}。

无法修改xml,任何想法? 谢谢!

1 个答案:

答案 0 :(得分:0)

使用 XSD 1.1 ,您可以为每种情况声明替代类型。此外,您可以将<Data>元素的数量限制为四个,并添加一个断言以保证每个不同的属性只出现一次:

<xs:element name="DataGroup">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Data" maxOccurs="4" minOccurs="4">
                <xs:alternative type="NameData"  test="@name='name'" />
                <xs:alternative type="AgeData"   test="@name='age'" />
                <xs:alternative type="ZipData"   test="@name='zipcode'"/>
                <xs:alternative type="StateData" test="@name='state'"/>
            </xs:element>
        </xs:sequence>
        <xs:assert test="Data/@name='name' and Data/@name='age' and Data/@name='zipcode' and Data/@name='state'"></xs:assert>
    </xs:complexType>
</xs:element>

由于<Data>是一个简单类型,您需要将该属性声明为每种类型的扩展名:

<xs:complexType name="NameData">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute name="name" type="xs:string"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>
<xs:complexType name="AgeData">
    <xs:simpleContent>
        <xs:extension base="AgeType">
            <xs:attribute name="name" type="xs:string"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>
<xs:complexType name="ZipData">
    <xs:simpleContent>
        <xs:extension base="ZipType">
            <xs:attribute name="name" type="xs:string"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>
<xs:complexType name="StateData">
    <xs:simpleContent>
        <xs:extension base="StateType">
            <xs:attribute name="name" type="xs:string"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType> 

您在简单类型的基础类型中声明的限制:

<xs:simpleType name="AgeType">
    <xs:restriction base="xs:integer">
        <xs:minExclusive value="20"/>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="StateType">
    <xs:restriction base="xs:string">
        <xs:pattern value="[A-Z]{2}"/>
    </xs:restriction>
</xs:simpleType>

<xs:simpleType name="ZipType">
    <xs:restriction base="xs:string">
        <xs:pattern value="\d{5}"/>
    </xs:restriction>
</xs:simpleType>

这将验证您的文件是否符合您的要求。