Xml 为什么可以';我不能把xs:all放在xs:sequence中吗?

Xml 为什么可以';我不能把xs:all放在xs:sequence中吗?,xml,xsd,xsd-validation,xml-validation,relaxng,Xml,Xsd,Xsd Validation,Xml Validation,Relaxng,我对XML模式还是有点陌生,我尝试在RELAXNG Compact中做一些类似的事情: test = element test{ element A {text}, element B {text}, (element C {text}? & element D {text}?) } 这意味着测试元素中包含A,然后是B,然后是任意顺序的C和D,这两个都是可选的 在我看来,我应该能够简单地说 <xs:element name="test"> <xs:comple

我对XML模式还是有点陌生,我尝试在RELAXNG Compact中做一些类似的事情:

test = element test{
element A {text},
element B {text},
(element C {text}? &
element D {text}?)
}
这意味着测试元素中包含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>

但是它不允许我把
放在
里面。说

s4s elt必须匹配。1:“序列”的内容必须匹配 (注释?,(元素|组|选择|序列|任意)*)。问题 被发现始于:所有

所以我试着从
中取出
,就像这样:

<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无效内容。1:“#ANNTYPE_测试”的内容无效。元素“all”无效、放错位置或出现频率过高


所以我很困惑,因为它看起来很简单,但我不知道怎么做。

你的困惑是可以理解的。问题是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>


另一个解决方法是强制执行命令;允许任何顺序在实践中通常并不重要。

在我看来,设计的原因之一是允许混合顺序独立(
all
)和顺序依赖(
sequence
choice
,…)模型组将增加XML模式验证在算法方面的复杂性,并将给实施者带来更多负担

但除此之外,在某些涉及可选元素的情况下,在将元素与粒子(即模型组内的元素声明)匹配时也可能导致歧义,从而引入非确定性或实现依赖性,这对于互操作性来说是不可取的

总的来说,这些限制的好处超过了它们的成本。大多数XML模式用户使用
sequence
choice
并强制执行命令(参见kjhughes的示例)


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

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