XSD:根据属性检查子元素的顺序

时间:2013-01-09 07:47:03

标签: xml xsd

我正在尝试检查xml中的子元素的顺序,

我的xml是

<main>
<col name="name1">test1</col>
<col name="name2">test2</col>
<col name="name3">test3</col>
<col name="name4">test4</col>
<col name="num1">true</col>
</main>

我需要验证子元素是否以正确的顺序显示。我文件中的子元素都具有相同的名称但属性不同。

<xs:element minOccurs="0" maxOccurs="unbounded" name="col">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type ="OrderCheck" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>

我最好还是喜欢

<xs:complexType name="OrderCheck">
    <xs:sequence>
    <xs:element name="name1" type="xs:string"/>
    <xs:element name="name2" type="xs:string"/>
    <xs:element name="name3" type="xs:string"/>
    <xs:element name="name4" type="xs:string"/>
    <xs:element name="num1" type="xs:boolean"/>
    </xs:sequence>  
    </xs:complexType>

为了能够使用xs:sequence我需要定义一个xs:complexType但是我无法在“属性”类型下定义complexType,我只能定义一个简单的类型。但是我不能使用xs :simpleType下的序列。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

如果您可以使用XSD 1.1(在Xerces beta和Saxon-EE中实现),那么您可以使用断言来执行此操作。

有时在这种情况下有用的另一种技术是将验证过程实现为两阶段管道,包括转换后跟验证步骤。转换通常会转换

<col name="name1">test1</col>

<name1>test1</name1>

然后你有一个很容易接受XSD 1.0验证的结构。

答案 1 :(得分:1)

不幸的是,XSD 1.0无法实现您的目标。使用sequence,您可以指定不同类型的所需顺序,但不能使用不同数据的相同类型。

我相信Schematron可以用于此。