允许/限制基于其他属性的XML属性

时间:2009-06-09 13:37:40

标签: xml xsd

是否可以使用以下行为创建XML架构?我有一个XML文件,如下所示。我想根据Type的值公开或限制Object的属性。例如,如果Type =“Bike”,我可能想要公开仅与Bike相关的属性(即踏板,框架等)。如果Type =“Car”,我可能想要公开仅与Car相关的属性(即Make,Model,Miles等)。

<Objects>
  <Object Type="Bike" Pedals="XXX" Frame="XXX" />
  <Object Type="Car" Make="XXX" Model="XXX" Miles="XXX" />
</Objects>

提前感谢您的帮助。如果您有任何问题,请告诉我。

4 个答案:

答案 0 :(得分:4)

我的理解是,这超出了使用xsd所能做的。此外,它使查询成为一场噩梦。首选方法(如果可能)是使用:

<vehicles>
  <bike pedals="XXX" frame="XXX" />
  <car make="XXX" model="XXX" miles="XXX" />
</vehicles>

carbike可能在xsd中有一个共同的根vehicle,但是它们自己的特定属性(在继承的属性之上)。

答案 1 :(得分:2)

我认为你在属性中填充了太多东西。像踏板和框架这样的东西应该是元素。

答案 2 :(得分:0)

我同意Marc您正在尝试做的事情超出了W3C XML-Schema的功能。我也同意你的数据模型只是有点过载/模糊而无用。但是,如果您在此问题上别无选择,那么SchematronRelax-NG可能会提供可行的解决方案。

答案 3 :(得分:0)

是的,您只需使用xsi:type而不是Type来获取XSD多态性(并且在模式中,从常见类型派生类型):

<Objects>
  <Object xsi:type="Bike" Pedals="XXX" Frame="XXX" />
  <Object xsi:type="Car" Make="XXX" Model="XXX" Miles="XXX" />
</Objects>

有关详细信息,请参阅XML Schema Part 0: Primer。它有example schema,其中 USAddress UKAddress 类型来自地址。使用xsi:type进一步向下example instance

相关问题