在DTD和XSD架构中不允许非确定性元素声明的原因是什么?

时间:2010-12-24 02:42:40

标签: xml xsd dtd

以下声明:

<!ELEMENT p ((b, a) | (b, c))>

根据验证器和快速检查规范,

及其XSD等效项均无效,因为它们不具有确定性。但是,由于每个非确定性有限自动机都具有等效的确定性有限自动机,并且由于存在将NFA转换为DFA的算法,因此禁止非确定性声明的原因是什么?

2 个答案:

答案 0 :(得分:2)

对于这样的问题,有两类可能的答案:技术和历史。

XML DTD或XSD的确定性规则没有合理的技术原因。

由于确定性规则,两个XSD内容模型的交集和并集不能保证可以用合法的XSD内容模型来描述。正是由于确定性规则,一些常规语言不能表达为内容模型。正是由于决定论规则,XSD中的抽象类型和替换组到目前为止还缺乏使词汇表易于扩展的潜力。简而言之,确定性规则对SGML,XML DTD或XSD没有任何贡献,但是无意义的复杂化(并且在SGML和XSD的情况下,crackpot术语:歧义实际上不是歧义,并且独特的粒子归属而不是强决定论 - 为什么在使用九个时使用五个音节?)。

这留下了历史答案。

我在这些评论的前言中说,对于这段令人遗憾的历史,我向那些关心这些事情的人道歉。我试图说服工作组在1996年设计XML DTD时摆脱了确定性规则,但我失败了。我试图说服XML Schema WG在1998-2001我们设计XSD 1.0时没有采用它们,但我失败了。我试图说服WG在2001 - 2012年摆脱它们,当XSD 1.1逐渐(非常,非常逐渐地)形成时,我又失败了。抱歉;我确实试过了。

最初创建规则的SGML工作组(在ISO 8879中)以及投票保留规则的XML和XML模式工作组中的那些人提供了各种合理化,多年来我一直在问他们

XML WG中的一些人认为,确定性规则提供了解析器 - 编写者任务的有用简化。愤世嫉俗者一再暗示(私下)该规则的出现最初是因为SGML工作组的有影响力的成员无法弄清楚如何正确地进行回溯工作;工作组中的其他人热烈否认了这一说法。 (有趣的是,我的回忆是,在XML工作组中,那些主张确定性简化解析器任务的人包括James Clark,他批评the message cited by chris中对这个问题的答案中的确定性规则。我希望他在为时已晚之前改变了主意。)工作组中的其他人认为确定性规则是假的,但我们无法改变它而没有与SGML不可接受的不兼容性。

在XML Schema WG中,一些WG成员告诉我他们认为确定性是一个好主意,因为它意味着XSD验证器可以使用现有DTD验证器的内容模型验证代码库。 (真相!这表明了对代码重用或者可能过度消耗致幻剂的相当感人的信念。)当时,许多工作组成员给我的印象是他们没有觉得他们清楚地理解这个问题以获得独立观察并认为与DTD的向后兼容性比进行可能产生无法预见的后果的更改更安全。如果它被证明是不必要的或无益的,那么稍后(他们认为)会很容易改变。 (后来,在XSD 1.1工作期间,供应商抵制任何消除决定论规则的企图,好像他们正在排斥对他们的美德的攻击。对于&#34;我们总是可以放松约束&#34;。)< / p>

有些人(SGML和XSD工作组中)都建议确定性规则很有用,因为它允许注释与内容模型中的特定位置相关联。在XSD的情况下,这对我来说是一场失败的战斗 - 根据实例中的位置进行注释同样容易,现有的XPath基础架构和思想共享使得这是一个更好的选择。在SGML案例中,由于XPath尚未发明,因此该论证并不适用,但在内容模型的单个粒子上不允许使用SGML注释,因此在任何情况下这个想法都是不可能的。 。

然而,这个想法依然存在于XSD架构作者将xs:annotation元素添加到内容模型中的单个粒子的能力中。我已经问了十四年左右现在没有找到任何在生产模式中使用过这个工具的人,任何在实验测试模式中使用过这个工具的人,或者任何听过任何人在任何一种模式中使用这个工具的人一点都不我也没有发现任何人能够提供一个有用的具体应用程序的连贯帐户。 (作为回应,他们向我指出,我从来没有提供过一个铁证,证明它在任何情况下都不会有帮助,一式三份,由五位正式的软件工程教授代言。他们是对的;我猜测我只是懒惰。但是我从来没有理解为什么在XSD中包含愚蠢行为的标准是如此之低,以及消除它们如此之高的标准。)

我听过的唯一一半合理的论据来自一些(很少)有思想的工作组成员(很少 - 很好,一个)明确表示他们完全理解技术问题,但在交易中 - 他们想到的服务器部署方案,即使在模式预编译和缓存不可行的情况下,验证速度也是必不可少的。因此,他们希望保留确定性约束,以避免(a)使用NFA而不是DFA进行验证的成本,以及(b)确定NFA的二次成本。我实际上并不认为这是一个令人信服的论点(为什么交易服务器的架构缓存是不可能的,出于天堂的缘故?),但是无可否认地提出交易服务器的人比我做的更多。

总而言之:SGML发明了确定性规则,原因是迷失在时间的迷雾中;工作组中没有两个成员讲述同样的故事,我得出的结论是,没有就制定规则的理由达成共识,只有很多个别原因。 XML DTD保留了与SGML兼容的规则(合法的SGML DTD是合法的XML是不够的,我们希望所有合法的XML DTD都是合法的SGML - WG由 SGML人员组成) 。 XSD从XML DTD获得了确定性规则,然后保留它没有特别的原因,但是恐惧,不确定和怀疑。

叹息。

答案 1 :(得分:1)

显然,唯一的理由是SGML兼容性: http://lists.w3.org/Archives/Public/xml-editor/2001JanMar/0011.html