【问题标题】:XSD : Check order of child elements based on attributeXSD:根据属性检查子元素的顺序
【发布时间】:2012-12-23 05:17:46
【问题描述】:

我正在尝试检查 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下的序列。我该如何解决这个问题?

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

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

    我相信Schematron 可以用于此。

    【讨论】:

      【解决方案2】:

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

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

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

      <name1>test1</name1>
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-02
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        相关资源
        最近更新 更多