DTD。元素类型声明。不同的内容规格'和'内容模型'

时间:2014-06-24 14:33:17

标签: xml dtd sgml

我看了Extensible Markup Language (XML) 1.0 (Fifth Edition) W3C Recommendation 26 November 2008
3.2元素类型声明具有:  元素类型声明采用以下形式: 元素类型声明

elementdecl ::= <!ELEMENT Name contentspec >
contentspec ::= 'EMPTY' | 'ANY' | Mixed | children

3.2.1元素内容中有: 元素内容模型

children ::= (choice | seq) ('?' | '*' | '+')?
cp ::= (Name | choice | seq) ('?' | '*' | '+')?
choice ::= '(' S? cp ( S? '|' S? cp )+ S? ')'
 seq ::=    '(' S? cp ( S? ',' S? cp )* S? ')'

之后我有疑问。哪种不同的内容规格&#39;和&#39;内容模型&#39;。

也许 contentspec 是ANY,PCDATA,混合,孩子

只有孩子有&#39; 内容模型&#39;:(elemName1 | elemName2,elemName3,elemET)。

(姓名|,&#39;?&#39;&#39; *&#39;&#39; +&#39;),顺序,选择 - 所有这些都是&#39; 内容模型&#39;。正确?

混合是否有&#39; 内容模型&#39;?

在教程中经常写:

<!ELEMENT Name content_model >

1 个答案:

答案 0 :(得分:0)

你明白了。

  

contentspec 是ANY,PCDATA,混合,儿童。   只有孩子才有内容模型&#39;

它描述了元素可以拥有的所有内容类型:

  • EMPTY代码 - 无内容
  • ANY DTD中定义的任何其他元素 - 一种自由格式
  • 混合内容,在XML建议的3.2.2中描述
  • children ,在XML建议的3.1.1中描述

内容模型允许使用序列,选择,parenthis等,例如((a|b)|(c+, d?, e*))?,仅引用其他元素 - 此处不允许#PCDATA

混合内容有点特别,因为此模型只能 使用选项,因此与内容模型截然不同。混合内容可以是#PCDATA,也可以是(#PCDATA | a | b | c)*。在后一种情况下,您需要打开括号(#PCDATA必须先出现,然后指定由选项|分隔的允许元素,并通过关闭括号{{1}来完成},零或更多出现说明符)

所有这一切的后果在 3.2.2混合内容

中提供
  

在这种情况下,可以约束子元素的类型,但不限制它们的顺序或它们的出现次数

特别是,它无法定义元素:

  • 可以包含文字(*)或一系列元素:例如: (#PCDATA)| (a,b,c))无效
  • 必须以元素开头,后跟文本,然后是其他元素:例如#PCDATA也无效

您无法确保XML实例中的元素完全具有任何内容(它可以保持为空)。