【问题标题】:Allowing/Restricting XML Attributes based other Attributes允许/限制基于其他属性的 XML 属性
【发布时间】:2009-06-09 13:37:39
【问题描述】:

是否可以创建具有以下行为的 XML 模式?我有一个如下所示的 XML 文件。我想根据 Type 的值公开或限制 Object 的属性。例如,如果 Type="Bike" 我可能想公开仅与 Bike 相关的属性(即 Pedals、Frame 等)。如果 Type="Car",我可能想公开仅与 Car 相关的属性(即品牌、型号、里程等)。

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

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

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

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

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

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

    【讨论】:

    • 我不确定是否有任何技术原因导致这不可能 - 这绝对是正确的方法,尽管我正在努力寻找文档,但 W3C 甚至已经专门解决了这个问题.
    • “如果可能的话”,我的意思是“为你的场景”;-p
    【解决方案2】:

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

    【讨论】:

    • 旧线程但是,为什么?它们是简单的值,为什么应该是元素而不是属性?
    • 当然,我可以看到。而且该属性占用的字节数也比元素 start+body+end 标签少。感谢您的链接。
    • @Josh - 如果您担心尺寸,我认为您可能使用了错误的工具来完成这项工作。同样的论点可以认为Pedals 占用了太多字节,如果您只是将该字段命名为P,则可以节省大量存储空间。这听起来是个好主意吗?这可能看起来像减少荒谬,但实际上,它会节省很多字节。怎么样:压缩 XML。然后,您可以拥有团队喜欢的任何架构,并且仍然可以节省大量空间。
    • 我不关心大小,只是提一下。我们在这里达成一致。 ;-)
    【解决方案3】:

    我同意Marc 的观点,即您尝试做的事情超出了 W3C XML-Schema 的能力范围。我也同意您的数据模型只是有点过载/模棱两可有用。但是,如果您在这件事上别无选择,那么Schematron 或Relax-NG 可能会提供一个可行的解决方案。

    【讨论】:

      【解决方案4】:

      是的,对于 XSD 多态性,您只需使用 xsi:type 而不是 Type(并且在架构中,从通用类型派生类型):

      <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 类型派生自 Address。再往下是使用xsi:type 的example instance。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-01
        • 2016-02-23
        • 2019-09-02
        • 1970-01-01
        • 2018-10-16
        • 1970-01-01
        • 2018-11-30
        相关资源
        最近更新 更多