0

我有关于在为 XML 定义 DTD 时指定元素的子部分的问题。我想要一个名为“Description”的元素,它可能具有 BookRef 和 PCDATA 的任何交错序列。我在我的 XML DTD 中使用了以下语句。

<!ELEMENT Description (#PCDATA|Courseref)* >

但是,我想强制执行比 *. 我想使用 +,它应该要求至少有一个 PCDATA 或 Courseref。但是,当我使用 + 而不是 * 时,使用 xmllint 会出现解析错误。

我是 DTD 的新手,我想知道,根据 XML DTD Specs 指定 + 运算符是否非法。

4

2 回答 2

0

由于您有一个混合内容模型(#PCDATA 和元素 ( Courseref)),因此您必须使用*出现指示器。

如果模型中没有#PCDATA,则可以使用+.

来自规范的混合内容模型部分的关键信息:

...子元素的类型可能受到限制,但不受其顺序或出现次数的限制

于 2012-08-08T15:23:51.147 回答
0

是的,XML 规范要求表单的内容模型

(#PCDATA | foo | bar | baz)*

首先列出#PCDATA并使用*not +(或其他任何内容)作为出现指示符(http://www.w3.org/TR/xml/#NT-Mixed)。

许多设计考虑都在其中发挥了作用,其中大多数现在具有纯粹的历史重要性。然而,有一个可能值得注意:如果+被允许并且你确实写了

<!ELEMENT Description (#PCDATA|Courseref)+ >

元素声明将定义与使用的表单完全相同的一组有效元素实例*:令牌#PCDATA匹配已解析字符数据的零个或多个字符,因此元素实例<Description/>对元素声明的任何一种形式(零长度string 匹配内容模型标记#PCDATA一次,因此+将满足至少一次满足 -marked 选择的要求)。

您可以通过使 Description 包含在此处传达您的意图

(p+ | Courseref)

并在文档中说空p(段落)元素是不受欢迎的。但是 DTD 没有提供一种要求#PCDATA字符串有任何最小长度内容的方法。这就是一些人喜欢使用 XSD、Schematron 或 Relax NG 的原因之一。

于 2012-08-21T19:09:50.017 回答