XSD 1.1如何实现condition内keyword禁止携带文本的空值校验
问题诊断
你的原有写法存在三个核心问题:
- 例5、例6的
$value变量指向错误:在condition的complexType断言中,$value指代的是当前condition元素的整体字符串值,而非内部keyword子元素的文本内容。你的校验目标是限制子元素keyword的内容,而非condition本身的内容,因此逻辑完全不匹配。 - 例7的XPath语法不符合规范:不存在
::child::string-length()这种写法,XPath路径表达式语法错误,因此直接抛出评估失败报错。 - 核心逻辑偏差:你没有将校验范围指向
condition下的所有keyword子元素,导致无法拦截例4中keyword携带文本的错误写法。
正确实现方案
你需要通过XPath遍历condition下所有keyword子元素,要求每个keyword的文本内容长度为0。如果需要匹配需求中「condition内的keyword仅允许通过group属性引用分类」的要求,还可以同时加上group属性存在校验。
正确的complexType定义如下:
<xs:complexType name="condition" mixed="true"> <xs:sequence> <xs:element name="keyword" type="keyword" minOccurs="1" maxOccurs="5"/> </xs:sequence> <!-- 断言要求:所有内部keyword元素都没有文本内容,且必须携带group属性 --> <xs:assert test="every $k in ./keyword satisfies (string-length($k) = 0 and exists($k/@group))"/> </xs:complexType>
如果你只需要禁止keyword携带文本,不需要强制group属性,去掉and exists($k/@group)部分即可。
补充说明
如果你的XSD处理器兼容性要求较高,也可以通过类型重定义的方式实现:为condition内的keyword单独定义一个仅允许空内容、可选/必选group属性的受限类型,和全局keyword类型区分开,这种方式不需要写断言,适配性更好。
内容的提问来源于stack exchange,提问作者Daniel Janz
相关产品推荐
相关产品推荐

