【问题标题】:Why can't I put an xs:all inside a xs:sequence?为什么我不能将 xs:all 放在 xs:sequence 中?
【发布时间】:2017-12-01 02:12:21
【问题描述】:

我对 XML Schema 还是有点陌生​​,我正在尝试在 Relax NG Compact 中做一些看起来像这样的事情:

test = element test{
element A {text},
element B {text},
(element C {text}? &
element D {text}?)
}

这意味着在 test 元素中包含 A,然后是 B,然后是 以任意顺序 C 和 D,它们都是可选的。

按照我的看法,应该可以简单地说

<xs:element name="test">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="A"/>
            <xs:element name="B"/>
            <xs:all>
                <xs:element name="C"/>
                <xs:element name="D"/>
            </xs:all> 
        </xs:sequence>
    </xs:complexType>
</xs:element>

但它不允许我将 &lt;xs:all&gt; 放入 &lt;xs:sequence&gt; 中。话说

s4s-elt-must-match.1: 'sequence' 的内容必须匹配 (注释?,(元素 | 组 | 选择 | 序列 | 任何)*)。一个问题 发现开始于:所有。

所以我试着像这样从&lt;xs:sequence&gt; 中取出&lt;xs:all&gt;

<xs:element name="test">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="A" />
                <xs:element name="B"/>
            </xs:sequence>
            <xs:all>
                <xs:element name="C"/>
                <xs:element name="D"/>
            </xs:all> 
        </xs:complexType>
    </xs:element>

但是现在还是不行,说

s4s-elt-invalid-content.1:“#AnonType_test”的内容无效。元素 'all' 无效、放错位置或频繁出现

所以我很困惑,因为它看起来很简单,但我不知道如何做到这一点。

【问题讨论】:

  • “为什么?”问题总是很困难。你真的在问为什么规范的作者选择强加这个限制吗?或者您是否要求提供有关限制性质的更准确信息?还是您在问如何绕过限制?
  • 你是对的,“为什么?”问题不是最好的,但它是一个两部分的问题。 “首先,我只是错过了一些简单的解决方法吗?如果没有,为什么 xsd 不允许我们做这么简单的事情?” 我知道强制排序不是一个坏主意,但我想知道怎么会这样在 Relax NG Compact 中很简单,但在 Xml Schema 中是不可能的。我听说有一种方法可以将 rnc 转换为 xsd,所以我想知道它如何转换序列中 '&' 字符的使用。
  • XSD 中的一些限制是因为经过深思熟虑的设计选择,特别是 (a) 没有回溯,以及 (b) 对元素的明确类型分配(RNG 不提供)。有些是因为 WG 有点家长式作风:他们想强制执行他们认为好的文档设计。有些人在那里,因为这是一个非常大的委员会,并不总是在所有事情上都达成一致,所以他们做出了没有人满意的妥协。

标签: xml xsd xsd-validation xml-validation relaxng


【解决方案1】:

您的困惑是可以理解的。问题是XSD设计是不规则的,不规则的设计往往违背我们的预期。

这是一种变通方法,不幸的是,它更冗长,而且对于要排列的大量元素也是不切实际的:

  <xs:element name="test">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="A"/>
        <xs:element name="B"/>
        <xs:choice minOccurs="0">
          <xs:sequence>
            <xs:element name="C"/>
            <xs:element name="D" minOccurs="0"/>
          </xs:sequence>
          <xs:sequence>
            <xs:element name="D"/>
            <xs:element name="C" minOccurs="0"/>
          </xs:sequence>
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

另一种解决方法是强制排序;允许任何顺序在实践中通常并不重要。

【讨论】:

    【解决方案2】:

    在我看来,设计的原因之一是允许混合顺序无关 (all) 和顺序相关 (sequence, choice, ...) 模型组会增加复杂性XML Schema 在算法方面的验证,会给实现者带来更多的负担。

    但更重要的是,在某些涉及例如可选元素的情况下,在将元素与粒子匹配时(即模型组内的元素声明)也可能导致歧义,从而引入不确定性或实现依赖性,即不适合互操作性。

    总体而言,此类限制的好处大于成本。大多数 XML Schema 用户使用 sequencechoice 并强制执行命令(参见 kjhughes 的示例)。

    Relax NG(我不熟悉)可能会使用不同的模型来描述元素的内容,并且该模型可能与不同的设计决策兼容。

    【讨论】:

      猜你喜欢
      • 2017-11-28
      • 1970-01-01
      • 2010-10-11
      • 2013-05-06
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多