【发布时间】: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>
但它不允许我将 <xs:all> 放入 <xs:sequence> 中。话说
s4s-elt-must-match.1: 'sequence' 的内容必须匹配 (注释?,(元素 | 组 | 选择 | 序列 | 任何)*)。一个问题 发现开始于:所有。
所以我试着像这样从<xs:sequence> 中取出<xs:all>:
<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