XML-Schema:如何将枚举设置为每个文档的一个外观

时间:2011-04-16 15:26:08

标签: xml xsd

我想为所有元素添加name-attribute。为了确保只允许某些属性值,我创建了一个限制模式。有没有办法确保每个文档只使用一次枚举值?

simpleStyle:

<xsd:simpleType name="myname">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="1"/>
        <xsd:enumeration value="2"/>
    </xsd:restriction>
</xsd:simpleType>

XML

<element  name="1"/>
<element  name="2"/>
<element  name="1"/>

不应该允许最后一个。

这甚至可能吗?

2 个答案:

答案 0 :(得分:2)

有一个类似的概念称为身份约束,可能适合您的目的。您希望使用xs:unique,它是父元素的约束,而不是枚举的属性。类似的东西:

<xs:unique name="myconstraint">
 <xs:selector xpath=".//*"/>
 <xs:field xpath="@name"/>
</xs:unique>

selector说明约束适用的子元素(本例中的所有后代),field表示哪个部分必须是唯一的。

答案 1 :(得分:0)

正如@xan和this guide正确建议的那样,您可以通过以下方式更改代码:

  1. 定义myname枚举
    这样只允许使用12值。

    <!-- The Enumeration definition (allowing only values 1 or 2) -->
    <xsd:simpleType name="myname">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="1"/>
            <xsd:enumeration value="2"/>
        </xsd:restriction>
    </xsd:simpleType>
    
  2. 定义element结构
    这将定义<element name="..." />节点的结构。

    <!-- the element definition (defines the <element /> structure) -->
    <xs:complexType name="elementType">
        <xs:attribute name="name" type="myname" use="required"/>
    </xs:complexType>
    
  3. Univque usage
    定义element标记用法,要求对name属性进行单向使用。

    <xs:element name="myelements">
    
        <!-- The <element/> tag usage -->
        <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
                <xs:element name="element" type="myname"/>
            </xs:sequence>
        </xs:complexType>
    
        <!-- The univocity constraint -->
        <xs:unique name="nameUniqueConstraint">
            <xs:selector xpath="element"/>
            <xs:field xpath="@name"/>
        </xs:unique>
    
    </xs:element>
    
  4. 请注意,nameUniqueConstraint只是一个任意名称,用于标识您想要的约束。