You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:58:13