Xml 为什么可以';我不能把xs:all放在xs:sequence中吗?
我对XML模式还是有点陌生,我尝试在RELAXNG Compact中做一些类似的事情: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
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没有提供)。有些是因为工作组有点家长式作风:他们想强制执行他们认为好的文档设计。其中一些人是因为这是一个非常大的委员会,并不总是在所有问题上达成一致,所以他们做出了没有人满意的妥协。