我有以下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的错误,即我不能有两个具有不同类型的同名元素。
有什么想法吗?或者甚至可能吗?
答案 0 :(得分:0)
唯一可行的方法(使用XSD)可以通过重构模式将操作用作元素名称而不是属性:
<collection>
<remove>1</remove>
<add>2</add>
<add>3</add>
</collection>
这样,您可以使用模式中的序列来确定顺序。
更一般地说:您的架构设计看起来有些混乱。您的元素名称似乎描述了一个状态(集合,项目),但您对项目的属性似乎带有关于您的代码(可能)采取的操作的实际信息。如果您可以选择设计,可能需要考虑进行轻微的重新设计。