能否在DTD中通过参数实体复用("0"|"1")布尔值定义?
解答
首先要明确:DTD的元素内容声明语法不支持直接限制文本内容的取值(比如强制只能是0或1),你之前的写法错误在于试图把文本枚举直接放在元素内容的位置,而元素内容声明只能是以下几种类型之一:
EMPTY(空元素)ANY(任意内容)(#PCDATA)(纯文本)- 元素模型(比如
(A|B)*这种子元素组合) - 混合内容(比如
(#PCDATA|A|B)*)
如果要实现布尔值的取值限制,正确的方式是通过属性的ENUMERATION类型,而参数实体可以用来复用这个枚举定义,示例如下:
<!-- 定义布尔值枚举的参数实体 --> <!ENTITY % BOOL_VALUES "0 | 1"> <!-- 定义Error元素,包含纯文本内容,同时带有一个必填的布尔属性 --> <!ELEMENT Error (#PCDATA)> <!ATTLIST Error isActive (%BOOL_VALUES;) #REQUIRED>
如果你的需求是让元素的文本内容只能是0或1,DTD本身无法在语法层面强制验证这一点,只能通过参数实体来统一标注元素为纯文本,但无法限制具体取值:
<!-- 用参数实体统一表示纯文本类型 --> <!ENTITY % BOOL_CONTENT "(#PCDATA)"> <!-- 定义Error元素为纯文本类型 --> <!ELEMENT Error %BOOL_CONTENT;>
总结:参数实体可以用来复用属性的枚举定义,但不能直接用来限制元素文本内容的取值——这超出了DTD的语法能力范围。
内容的提问来源于stack exchange,提问作者U. Windl
相关产品推荐
相关产品推荐

