1

我正在尝试检查 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:sequence简单类型。我怎样才能解决这个问题?

4

2 回答 2

4

如果您可以使用 XSD 1.1(在 Xerces beta 和 Saxon-EE 中实现),那么您可以使用断言来做到这一点。

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

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

<name1>test1</name1>

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

于 2013-01-09T10:52:33.483 回答
1

不幸的是,XSD 1.0 无法实现您想要做的事情。用sequence你可以指定不同类型所需的顺序,但不能使用不同的数据类型。

我相信Schematron可以用于此。

于 2013-01-09T08:24:10.360 回答