XSD模式限制中\w定义存疑,xmllint验证含下划线值失败
XSD模式验证中\w匹配问题排查
问题背景
某XSD文件使用以下模式规则限制属性值:
<xsd:pattern value="buyer_specific|customer_specific|duns|iln|gln|party_specific|supplier_specific|\w{1,250}"/>
当使用自定义属性值checkout_profile时,xmllint验证报错:
Schemas validity error :[...] The value 'checkout_profile' is not accepted by the pattern 'buyer_specific|customer_specific|duns|iln|gln|party_specific|supplier_specific|\w{1,250}'.
疑问:按PCRE规则,\w包含下划线、字母和数字,checkout_profile应该符合要求,是xmllint存在bug还是有认知遗漏?
问题原因
这不是xmllint的bug,是对XSD正则表达式规则的认知遗漏:
- XSD的正则表达式遵循XML Schema规范,并非PCRE规则。在XSD的
xsd:pattern中,\w仅匹配字母和数字,不包含下划线。 - 自定义值
checkout_profile包含下划线,无法被\w{1,250}匹配,且不在前面枚举的固定值列表里,因此触发验证错误。
解决方案
如果需要支持包含下划线的自定义属性值,需修改XSD的模式规则,把下划线明确加入匹配范围,比如:
<xsd:pattern value="buyer_specific|customer_specific|duns|iln|gln|party_specific|supplier_specific|[\w_]{1,250}"/>
或者直接使用更明确的字符范围定义:
<xsd:pattern value="buyer_specific|customer_specific|duns|iln|gln|party_specific|supplier_specific|[a-zA-Z0-9_]{1,250}"/>
内容的提问来源于stack exchange,提问作者SlowFox
相关产品推荐
相关产品推荐

