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

允许/限制基于其他属性的XML属性,xml,xsd,Xml,Xsd,是否可以创建具有以下行为的XML模式?我有一个如下所示的XML文件。我想根据类型的值公开或限制对象的属性。例如,如果Type=“Bike”,我可能希望公开仅与自行车相关的属性(即踏板、框架等)。如果Type=“Car”,我可能希望公开仅与汽车相关的属性(即品牌、型号、里程等) 提前感谢您的帮助。如果您有任何问题,请告诉我。我的理解是,这超出了xsd的能力范围。此外,它使查询成为一场噩梦。首选方法(如果可能)是使用: <vehicles> <bike pedals="XX

是否可以创建具有以下行为的XML模式?我有一个如下所示的XML文件。我想根据类型的值公开或限制对象的属性。例如,如果Type=“Bike”,我可能希望公开仅与自行车相关的属性(即踏板、框架等)。如果Type=“Car”,我可能希望公开仅与汽车相关的属性(即品牌、型号、里程等)



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

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

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


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

我认为您在属性中塞进了太多东西。踏板和框架之类的东西应该是元素。

我同意您试图做的事情超出了W3CXML模式的功能范围。我也同意,您的数据模型只是有点过载/模棱两可,不太有用。但是,如果您在这件事上没有选择,那么可能或者可以提供一个可行的解决方案。

是的,对于XSD多态性,您只需要使用
xsi:type
而不是
type
(在模式中,从公共类型派生类型):



有关详细信息,请参阅。它对此有一个定义,其中USAddressUKAddress类型派生自Address。接下来是一个using
xsi:type

我不确定是否有任何技术原因导致这不可能-这绝对是正确的方法,W3C甚至专门解决了这一问题,尽管我正在努力寻找文档-波尔德线,但是,为什么?它们是简单的值,为什么应该是元素而不是属性?@Josh-当然,我可以看到。但是属性占用的字节也比元素start+body+end标记少。谢谢你的链接。@Josh-如果你担心尺寸,我想你可能用错了工具。同样的理由是
Pedals
占用的字节太多,如果您只是将该字段命名为
P
,则可以节省大量存储空间。这听起来是个好主意吗?这看起来似乎是荒谬的简化,但实际上,它将节省大量字节。这样如何:压缩XML。然后,您可以拥有您的团队喜欢的任何模式,并且仍然可以节省大量空间。我不关心大小,只是提到它。我们在这里意见一致
<vehicles>
  <bike pedals="XXX" frame="XXX" />
  <car make="XXX" model="XXX" miles="XXX" />
</vehicles>
<Objects>
  <Object xsi:type="Bike" Pedals="XXX" Frame="XXX" />
  <Object xsi:type="Car" Make="XXX" Model="XXX" Miles="XXX" />
</Objects>