我对在定义 XML DTD 时指定元素的子部分有疑问。我想要一个标题为“Description”的元素,它可以具有 BookRef 和 PCDATA 的任何交错序列。我在 XML DTD 中使用以下语句。
<!ELEMENT Description (#PCDATA|Courseref)* >
但是,我想强制执行比 * 更严格的约束。我想使用 +,它应该强制要求至少有一个 PCDATA 或 Courseref。但是,当我使用 + 而不是 * 时,使用 xmllint 会出现解析错误。
我是 DTD 新手,我想知道根据 XML DTD 规范指定 + 运算符是否非法。
最佳答案
是的,XML 规范要求表单的内容模型
(#PCDATA | foo | bar | baz)*
列表#PCDATA
首先使用*
不是+
(或其他任何内容)作为出现指示符(http://www.w3.org/TR/xml/#NT-Mixed)。
许多设计考虑因素都参与其中,其中大多数现在具有纯粹的历史重要性。然而,有一个可能值得注意:if +
被允许并且你确实写了
<!ELEMENT Description (#PCDATA|Courseref)+ >
元素声明将定义与使用 *
的表单完全相同的一组有效元素实例。 :代币#PCDATA
匹配已解析字符数据的零个或多个字符,因此像 <Description/>
这样的元素实例对于任何一种形式的元素声明都有效(零长度字符串与内容模型标记 #PCDATA
匹配一次,因此满足 +
标记的选择至少满足一次的要求)。
您可以通过包含“描述”来表达您的意图
(p+ | Courseref)
并在文档中说空 p
(段落)元素不受欢迎。但是 DTD 没有提供一种方法来要求 #PCDATA
有任何最小长度内容。字符串。这是一些人更喜欢使用 XSD、Schematron 或 Relax NG 的原因之一。
关于xml - 在 XML DTD 中使用 + 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11852599/