是否存在可以为其制定RNG而不是XML Schema的XML文档集(或者相反)?能给我一个例子吗?
答案 0 :(得分:0)
当谈到“我们可以为其制定模式的一组XML文档”时,您是说该模式必须接受该组中的每个文档,并拒绝该组之外的每个文档?通常,如果您从一组任意文档开始,那么无论选择哪种模式语言,都不太可能能够制定这样的模式。确实,具有该属性的文档集将因一种模式语言而异。
此外,如果您的文档集是有限的,那么定义这样的架构并不是真的很有用,因为不可能编写任何符合该架构的新文档。如果文档集是无限的,那么定义文档集的唯一真实方法是编写符合文档的架构,这使整个事情变得毫无意义。
有些约束可以在RNG中表达,但不能在XSD中表达,还有一些约束可以在XSD中而不是RNG中表达。
例如,RelaxNG可以在混合内容中的文本节点的内容上定义更精确的规则,而XSD可以在子元素允许的基数范围上定义更精确的规则。
详细比较取决于您所谈论的XSD版本。
答案 1 :(得分:0)
正如OP与MK的交流所表明的,这里有一些误解的机会。因此,即使MK实际上已经回答了该问题,我也将在此处提供答复。
我认为问题是XSD和RNG是否具有相同的表达能力,如果不是,则它们是否比另一个具有更高的表达能力。
这就是说:每个架构都定义了一组文档(即,针对该架构有效的文档集)。有许多文档集(如MK所说),两种语言都无法为它们定义一个仅接受该文档集中的模式的架构。因此,提出这个问题的最清晰方法可能是:
给定模式语言L1中的模式,是否可以保证模式语言L2中有一个模式可以接受相同的输入文档集?
或等效地:
是否存在用语言L1表示的架构但没有与语言L2等效的架构?
答案是,提到的每种模式语言都可以表达某些模式,而其他模式则无法表达。
我将抛开xsi:type
之类的琐事,以及Relax NG使用XSD简单类型以及模式所接受的文档集的确切含义的问题的可能方式,尽管这些要点可能很重要在某些情况下。
没有XSD等效项的RelaxNG模式:
正如MK所指出的那样,RelaxNG模式可以控制非空白字符数据的位置:(a, b, text, c, d)
是Relax NG中的合法上下文模型,在XSD中没有等效模型。
因此,作为XSD中没有等效功能的Relax NG模式(紧凑语法)的示例,请考虑以下内容:
start = e
e = element e { (e, text, e)? }
XSD内容模型必须是确定性的(以XSD规范的术语来说,它们必须服从“唯一粒子归因”约束),而Relax NG内容模型则不必如此。因此,象棋游戏的可能动作顺序可以在Relax NG中表达,而不能在XSD中表达:(white, black)*, white?
。 (由于每个不确定性FSA都具有确定性等效项,因此有时使人感到惊讶的是,内容模型并非如此: not 是每个非确定性内容模型都可以重写为内容模型的情况等价的确定性内容模型。AnneBrüggemann-Klein在她的 Habilitationsschrift 中确定了几十种没有确定性内容模型的常规语言。
start = element game { (white, black)*, white? }
white = element white {sq}
black = element black {sq}
sq = attribute square { text }
由于Relax NG在内容模型中包含属性,因此在Relax NG中,可以使元素的有效内容模型取决于其属性之一的值,这在XSD 1.1中是可能的,但在XSD 1.1中是不可能的在XSD 1.0中。
start = element whaddyawant {
(attribute gimme { 'a' }, a+)
| (attribute gimme { 'b' }, b+)
}
a = element a { empty }
b = element b { empty }
没有RelaxNG等效项的XSD架构:
XSD定义了类型,以支持XML DTD中可表示的ID / IDREF约束; Relax NG将它们降级为单独的“ DTD兼容性”,这(至少以我的经验)在实践中很尴尬且容易出错。特别是,如果架构声明的属性类型为ID,则任何具有通配符属性的通配符元素都可能引起麻烦。
XSD架构可以定义在Relax NG架构中无法表达的唯一性,键和键引用约束。示例:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="digraph" type="DG">
<xs:key name="node-ids">
<xs:selector xpath="node"/>
<xs:field xpath="@nodeID"/>
</xs:key>
<xs:keyref refer="node-ids" name="arc-ends">
<xs:selector xpath="node"/>
<xs:field xpath="@arc-to"/>
</xs:keyref>
</xs:element>
<xs:element name="node" type="N"/>
<xs:complexType name="DG">
<xs:sequence>
<xs:element ref="node" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="N">
<xs:attribute name="nodeID" type="xs:integer"/>
<xs:attribute name="arc-to" type="xs:integer" use="optional"/>
</xs:complexType>
</xs:schema>
XSD 1.1断言在Relax NG中没有类似物,并且可以用不能在Relax NG中表达的约束来表达约束。例如。在每个district
元素中,total/@n
中的值必须等于其他子项(n
)上number(total/@n) eq sum((* except total)/@n)
属性的总和。剩下的例子供读者练习。
请注意,MK不太正确地说“ XSD可以在允许子元素的基数范围上定义更精确的规则”。我不认为在XSD中可以表达的基数约束不能在Relax NG中表达。的确,在Relax NG中表达一个约束,即发票上必须至少有一行,但不能超过999行,这确实很繁琐。但这肯定是可能的。表示必须至少有一个但不超过九个a
元素的内容模型是(a, a?, a?, a?, a?, a?, a?, a? a?)
。很容易看到如何扩展它以处理发票上999行的情况。