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

能否通过DTD在XML属性值中使用正斜杠/?含正斜杠的枚举属性定义方法问询

DTD属性枚举值中的斜杠问题解答

首先直接给结论:XML属性值本身可以包含正斜杠/,但DTD的属性枚举选项不能直接使用带/的字符串——这就是你遇到语法错误的核心原因。

为什么你的DTD声明会报错?

DTD对属性枚举类型的选项有严格的语法要求:枚举中的每个选项必须是合法的NMTOKEN(名称标记符),而NMTOKEN的定义是只能包含字母、数字、下划线(_)、连字符(-)、点号(.)、冒号(:),斜杠/不在允许的字符范围内。

当你写(h/w | s/w)时,DTD解析器会把h当成第一个枚举选项,然后看到/,这不符合语法规则(它期待的是|或者)),所以会抛出类似"Expecting "|""、"Expecting ")""的错误,后续的错误也是因为前面的语法中断导致的连锁反应。

如何实现你的需求?

根据你的需求,有两种可行方案:

方案1:改用合法的NMTOKEN作为枚举值

把h/w和s/w替换成符合NMTOKEN规则的别名,比如hw和sw,然后在文档或业务逻辑中约定这些别名对应的实际含义。示例DTD:

<!ATTLIST item item_category (hw | sw) #REQUIRED>

对应的XML使用示例:

<item item_category="hw">...</item>
<item item_category="sw">...</item>

这个方案完全符合DTD语法,能让DTD帮你验证属性值的合法性。

方案2:使用CDATA类型,在应用层做验证

如果你必须在属性值中保留h/w或s/w的写法,那么无法使用DTD的枚举验证,只能改用CDATA类型,然后在你的应用程序代码中自行验证属性值是否为允许的选项。示例DTD:

<!ATTLIST item item_category CDATA #REQUIRED>

对应的XML使用示例:

<item item_category="h/w">...</item>
<item item_category="s/w">...</item>

注意:这种情况下DTD不会检查属性值是否为h/w或s/w,需要你自己在处理XML的代码中添加验证逻辑。

补充说明

如果你需要更灵活的属性值验证,也可以考虑改用XML Schema(XSD)替代DTD——XSD支持正则表达式验证,能直接约束属性值必须是h/w或s/w,比如:

<xs:attribute name="item_category">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="h/w|s/w"/>
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>

不过这需要你的XML解析环境支持XSD验证。

内容的提问来源于stack exchange,提问作者DjAs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:38:14