我有一个自定义XML,根据父元素的类型,其中可能缺少一些元素。例如,如果[ATCWaypointType]是"Airport",则[IICAO]元素只有一个子元素-[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]是"用户",则[IICAO]元素完全不存在:
<ATCWaypoint id="wpt01">
<ATCWaypointType>User</ATCWaypointType>
<WorldPosition>N57° 19' 35.48",W134° 8' 35.04",+000000.00</WorldPosition>
</ATCWaypoint>
在所有其他情况下,[IICAO]元素以完整形式表示:
<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>
是否可以根据元素的类型(Airport、User等)使用限制/方面来应用某种条件来验证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架构。
谢谢!
XSD 1.0中不可能。
在XSD 1.1中,您可以使用断言来实现这一点。如果您的ATCWayPointType是一个属性而不是一个元素,那么您也可以(更干净地)通过条件类型赋值来完成它。
如果您坚持使用1.0并且可以更改设计,请考虑将ATCWayPointType元素替换为直接命名模式类型的xsi:type属性。
还有一个人们往往会忘记的选项:在验证之前进行预处理转换。在这种情况下,预处理步骤可能会根据ATCWayPointType的值添加xsi:type属性。