基于属性限制XML元素的顺序

时间:2011-04-04 18:14:35

标签: xml xsd

我有以下XML:

<?xml version="1.0"?>

<coll xmlns="http://www.example.org/coll" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/coll coll.xsd">

    <collection>
        <item action="remove">1</item>
        <item action="add">2</item>
        <item action="add">3</item>
    </collection>

    <collection>
        <item action="add">2</item>
        <item action="remove">1</item>
        <item action="add">3</item>
    </collection>

</coll>   

和XSD:

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

    <element name="coll" type="tns:coll">
    </element>

    <complexType name="coll">
        <sequence>
            <element name="collection" type="tns:collection" minOccurs="0" maxOccurs="unbounded"></element>
        </sequence>
    </complexType>

    <complexType name="collection">
        <sequence>
            <element name="item" type="tns:item" minOccurs="0" maxOccurs="unbounded"></element>
        </sequence>
    </complexType>

    <complexType name="item">
        <simpleContent>
            <extension base="string">
                <attribute name="action">
                    <simpleType>
                        <restriction base="string">
                            <enumeration value="add"></enumeration>
                            <enumeration value="remove"></enumeration>
                        </restriction>
                    </simpleType>
                </attribute>
            </extension>
        </simpleContent>
    </complexType>

</schema>

我想限制item元素的顺序,以便删除总是在添加之前。 即第一个集合有效,但第二个集合无效。

我尝试过两个项目元素,一个带有add_item类型,另一个带有remove_item。但是这无法验证XSD的错误,即我不能有两个具有不同类型的同名元素。

有什么想法吗?或者甚至可能吗?

1 个答案:

答案 0 :(得分:0)

唯一可行的方法(使用XSD)可以通过重构模式将操作用作元素名称而不是属性:

<collection>
    <remove>1</remove>
    <add>2</add>
    <add>3</add>
</collection>

这样,您可以使用模式中的序列来确定顺序。

更一般地说:您的架构设计看起来有些混乱。您的元素名称似乎描述了一个状态(集合,项目),但您对项目的属性似乎带有关于您的代码(可能)采取的操作的实际信息。如果您可以选择设计,可能需要考虑进行轻微的重新设计。