2013-04-30 72 views
3

我需要一个DTD其允许元素A为具有0,1或2子元素B.我与DTD:0,1或2个元素

<!ELEMENT A (B? |(B,B))> 

尝试过,但然后我得到一个错误:

validity error : Content model of A is not determinist 

这是什么问题,我该如何解决它?或者不可能用DTD解决它?

+0

试试这个 – IndoKnight 2013-04-30 15:26:41

+0

这是我的第一个解决方案,但同样的错误再次 – SPie 2013-05-02 00:43:22

回答

1

内容模型,如

(B? |(B,B)) 

(B?, B?) 

(B? | (B,B) | B) 

是非确定性的;解析器无法分辨哪个B正在被匹配,而没有展望后面的内容。

XML 1.0建议中不允许使用非确定性内容模型:http://www.w3.org/TR/xml/#determinism。但是,确定性要求与SGML兼容。我想,这可能解释XML解析器之间的行为差​​异帮助:

  • xmllint(libxml2的)更“严厉”和报告上述所有内容模型为错误的(“A的内容模型不确定性“)。
  • Xerces-J(用于氧气的解析器,顺便说一句)大概不会试图与SGML兼容并接受它们。

参见:<!(?B1,B2)ELEMENT A>What is the reason for not allowing non-deterministic element declarations in DTDs and XSD schemas?

0

试试这个DTD,从而获得所需XML:

<!ELEMENT A ((B?|(B,B)|B))> 
<!ELEMENT B (#PCDATA)> 
+0

同样的错误 – SPie 2013-05-02 17:04:06

+0

我已经检查这个DTD,它在氧气中工作正常。它支持XML像,你需要的能力。 – 2013-05-03 05:35:11