【问题标题】:With XML Schema, is it possible to specify an optional attribute for all nodes?使用 XML Schema,是否可以为所有节点指定可选属性?
【发布时间】:2014-12-23 20:58:52
【问题描述】:

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

    <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>

使用一种位域将允许我的“扬声器”节点引用多个日期范围。但“演讲者”并不是我想以这种方式交叉引用的唯一节点。我有很多其他节点和子节点,并且我想避免向我在模式中创建的每个节点添加“交叉引用”属性,无论如何,随着我添加新的元素类型,这现在非常不稳定。 xml 中是否有任何内容允许我将“crossrefs”声明为文档中每个节点的可选属性?

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

我已经研究过 xml 交叉引用。至少就我对交叉引用的理解而言,问题在于我必须向每个节点添加一个子节点,才能让另一个节点充当交叉引用。丑陋。有没有更丑陋的方法来做这种事情?

编辑:

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

【问题讨论】:

  • XSLT 你的 XSD? 鬼脸
  • 哦,伙计,XSLT?我必须先获得 xml 架构的博士学位,然后才能做任何事情,哈哈。
  • 这是一个简短的评论 - 我自己对 XSD 只非常基本的熟悉 .. 和 SPD 中 XLST 1 的噩梦 ..

标签: xml xsd cross-reference


【解决方案1】:

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

假设您将此属性组命名为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 中,按照 Michael Kay 所说的去做。如果这不可行,至少声明命名的属性组并从所有应该拥有它的复杂类型中引用它。

【讨论】:

  • 恐怕我的野心超过了我相对于 xml 的技能。我根据您的示例创建了一个模式。它验证得很好。当我将它包含到我的主模式中时,它仍然有效。但我不知道如何使用该属性。当我向我的任何节点添加一个名为crossrefstns:crossrefs 的属性时,验证器让我很伤心。你能告诉我怎么做,或者给我一个资源吗?非常感谢。迈克尔的回答和你的回答都超出了我的想象,但你的回答给了我足够的可用细节来鼓励我继续尝试。我只是不知道在哪里可以找到我需要的信息。
【解决方案2】:

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

【讨论】:

  • 我花了很长时间才弄清楚该怎么做,但我做到了。感谢您为我提供了提出正确问题所需的词汇。
  • 对不起,我的回答太简短了。那是 12 月 23 日……无论如何,我喜欢为人们指明正确的方向,而不是牵手带他们到目的地。
猜你喜欢
  • 1970-01-01
  • 2014-05-13
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多