【问题标题】:DTD: 0, 1 or 2 ElementsDTD:0、1 或 2 个元素
【发布时间】:2015-02-11 07:02:33
【问题描述】:

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

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

然后我得到一个错误:

validity error : Content model of A is not determinist

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

【问题讨论】:

  • 试试这个
  • 这是我的第一个解决方案,但同样的错误

标签: xml dtd


【解决方案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 兼容并接受它们。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我已经检查了这个 DTD,它在 Oxygen 中运行良好。它可以根据需要支持等XML。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2022-11-19
    相关资源
    最近更新 更多