使用XML Schema,是否可以为所有节点指定可选属性?

时间:2014-12-23 20:58:53

标签: xml xsd cross-reference

这是我正在努力解决的问题。我希望一个节点能够引用多个其他节点。像这样:

    <ranges>
        <range localid="0001">2013-05-06</range>
        <range localid="0010">2014-01-02</range>
        <range localid="0100">2014-03-09</range>
        <range localid="1000">2014-11-12</range>
    </ranges>

    <speakers>
        <speaker crossrefs="0011">Sagan</speaker>
        <speaker crossrefs="1010">Krauss</speaker>
    </speakers>

使用某种位域可以让我的“扬声器”节点引用多个日期范围。但是“扬声器”并不是我想以这种方式交叉引用的唯一节点。我有很多其他节点和子节点,我想避免在我在模式中创建的每个节点添加“crossrefs”属性,这在我现在非常不知所措,因为我添加了新的元素类型。 xml中有什么东西可以让我将“crossrefs”声明为文档中每个节点的可选属性吗?

我觉得这就像xml允许在每个节点上使用的“id”属性一样。我查看了xml架构的架构,看看如何定义“id”属性,但我看不到任何看起来像我正在寻找的东西。有没有办法做到这一点?

我已经研究过xml交叉引用。至少就我所理解的交叉引用而言,问题在于我必须为每个节点添加一个子节点,以使另一个节点充当交叉引用。丑陋。是否有一种不那么难看的方式做这种事情?

编辑:

似乎this可能与我提出的问题相同,但到目前为止,我无法判断它是否真的相同。

2 个答案:

答案 0 :(得分:4)

在XSD 1.1中,使用您希望为全局的属性定义属性组。然后在defaultAttributes元素上提供xsd:schema属性,并将属性组的名称作为其值。

我们假设您将此属性组命名为my-globals。您的架构文档将(部分)看起来像这样:

<xsd:schema targetNamespace="http://example.com/global-atts"
            xmlns:tns="http://example.com/global-atts"
            defaultAttributes="tns:my-globals" 
            ...>

  <xsd:attributeGroup name="my-globals">
    <xsd:attribute name="crossrefs" ... />
    ...
  </

  ...

</

在XSD 1.0中,像迈克尔凯所说的那样。如果这不可行,至少要声明命名的属性组,并从应该拥有它的所有复杂类型中引用它。

答案 1 :(得分:2)

定义一个允许crossrefs属性的抽象基类型,然后通过扩展从该元素派生所有其他元素类型。