这是我正在努力解决的问题。我希望一个节点能够引用多个其他节点。像这样:
<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可能与我提出的问题相同,但到目前为止,我无法判断它是否真的相同。
答案 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属性的抽象基类型,然后通过扩展从该元素派生所有其他元素类型。