3

我需要一个 DTD,它允许元素 A 有 0、1 或 2 个子元素 B。我试过了

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

但后来我得到一个错误:

validity error : Content model of A is not determinist

有什么问题,我该如何解决?还是不能用DTD解决?

4

2 回答 2

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 中使用的解析器,顺便说一句)可能不会尝试与 SGML 兼容并接受它们。

另请参阅:在 DTD 和 XSD 模式中不允许非确定性元素声明的原因是什么?

于 2013-05-03T20:22:59.933 回答
0

试试这个 DTD 以获得所需的 XML:

<!ELEMENT A ((B?|(B,B)|B))>
<!ELEMENT B (#PCDATA)>
于 2013-05-02T13:17:22.797 回答