xml - 在 XML DTD 中使用 + 运算符

标签 xml dtd xml-validation

我对在定义 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/

相关文章:

c# - 从 xml 中删除非法 0x1f 字符

java - 多个 XML 文件验证的自动化

java - 没有为操作定义结果。验证 xml 上的表单内容时

java - JAXB:当使用 XML 模式 (.xsd) 验证 XML 文件时,如果验证失败,我能知道是哪个 XML 标记导致的吗?

python : How to navigate XML sub-nodes efficiently?

javascript - 如何在 jQuery mobile 中显示 XML 中的图像?

c# - 使用 x509 证书签署 xml 文档

css - 覆盖在生产服务器上为 DITA XML 文件定义的样式

xml - 将属性类型声明为 XML 中的实体时出现验证错误

xml - 当声明源是参数实体替换文本时,XML中相对URI的行为