使用XML Schema(XSD)进行条件验证

时间:2015-03-05 22:29:59

标签: xml vba validation xsd conditional

我有一个自定义XML,根据父元素的类型,某些元素可能不存在。例如,如果 [ATCWaypointType] “Airport” [ICAO] 元素只有一个孩子 - [ICAOIdent]

     <ATCWaypoint id="PAKT">
        <ATCWaypointType>Airport</ATCWaypointType>
        <WorldPosition>N55° 21' 38.88",W131° 43' 24.75",+000131.00</WorldPosition>
        <ICAO>
            <ICAOIdent>PAKT</ICAOIdent>         
        </ICAO>
    </ATCWaypoint>

如果 [ATCWaypointType] “用户”,则 [ICAO] 元素完全不存在:< / p>

    <ATCWaypoint id="wpt01">
        <ATCWaypointType>User</ATCWaypointType>
        <WorldPosition>N57° 19' 35.48",W134° 8' 35.04",+000000.00</WorldPosition>
    </ATCWaypoint>

在所有其他情况下, [ICAO] 元素全部表示:

    <ATCWaypoint id="SSR">
        <ATCWaypointType>VOR</ATCWaypointType>
        <WorldPosition>N58° 10' 39.60",W135° 15' 31.90",+000039.00</WorldPosition>
        <ICAO>
            <ICAORegion>PA</ICAORegion>
            <ICAOIdent>SSR</ICAOIdent>
        </ICAO>
    </ATCWaypoint>

是否可以使用限制/方面应用某种条件来验证XML,具体取决于元素的类型(机场,用户等),如下例中的OR运算符?:

<xs:element name="gender">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="male|female"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

以下是我正在使用的XSD Schema

谢谢!

1 个答案:

答案 0 :(得分:0)

XSD 1.0中无法使用。

在XSD 1.1中,您可以使用断言来完成。如果你的ATCWayPointType是一个属性而不是一个元素,你也可以使用条件类型赋值(更干净)。

如果您坚持使用1.0并且可以更改设计,请考虑使用直接命名模式类型的xsi:type属性替换ATCWayPointType元素。

还有一个人们往往会忘记的选项:在验证之前进行预处理转换。在这种情况下,您的预处理步骤可能会根据ATCWayPointType的值添加xsi:type属性。

相关问题