如何在DTD中验证大小写不敏感的属性值并解决声明报错?
问题解决方法
首先,你原来的DTD写法完全错误,DTD的ATTLIST语法根本不支持直接加正则表达式做值验证,而且你的语法格式不符合规范,这才导致了报错。更关键的是,DTD本身没有能力实现大小写不敏感的属性值匹配——DTD只能限制属性的类型(比如NMTOKEN)和是否必填,没法精确约束属性值的内容,更别说忽略大小写的匹配。
要实现你要的需求,得换用XML Schema(XSD),它支持正则验证,还能指定大小写不敏感的匹配规则。下面是具体实现:
XSD示例代码
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 定义makeOverText元素 --> <xs:element name="makeOverText"> <xs:complexType> <!-- 定义id属性:必填,值需大小写不敏感匹配common02v1 --> <xs:attribute name="id" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <!-- flags="i"开启大小写不敏感匹配 --> <xs:pattern value="common02v1" flags="i"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> </xs:schema>
验证逻辑说明
use="required"确保id属性是必填项,满足你的第一个要求。pattern的value="common02v1"配合flags="i",会忽略大小写匹配属性值,不管是CommOn02V1还是comMON02V1这类变体,都会被判定为合法。
合法的XML示例
<?xml version="1.0" encoding="UTF-8"?> <makeOverText xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="your-schema-file.xsd"> <!-- 以下id值都会通过验证 --> <!-- <makeOverText id="common02v1"/> --> <!-- <makeOverText id="CommOn02V1"/> --> <!-- <makeOverText id="comMON02V1"/> --> </makeOverText>
如果一定要坚持用DTD,那只能做到“必填+NMTOKEN类型”的验证,没法实现大小写不敏感的精确值匹配,这是DTD本身的功能限制,没有办法绕过。
内容的提问来源于stack exchange,提问作者A Programmer
相关产品推荐
相关产品推荐

