DTD:0,1或2个元素

时间:2013-04-30 14:31:18

标签: xml dtd

我需要一个允许元素A包含0,1或2个子元素B的DTD。我尝试了

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

然后我收到一个错误:

validity error : Content model of A is not determinist

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

2 个答案:

答案 0 :(得分: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(在Oxygen,btw中使用的解析器)可能不会尝试与SGML兼容并接受它们。

另请参阅:What is the reason for not allowing non-deterministic element declarations in DTDs and XSD schemas?

答案 1 :(得分:0)

尝试使用此DTD获取所需的XML:

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