如何在XSD中基于其他元素验证元素?关联校验问题求助
问题解决:关联freeText与terms的XSD断言校验
现有断言的问题点
- 字段名错配:你写的
../description对应不上XML里的实际字段freeText,直接导致判断条件完全失效。 - 上下文与逻辑错误:断言定义在
terms的complexType下,当前上下文就是<terms>节点,../terms/term等于重复引用自身;而且原判断里的else (term = *)是无效逻辑,完全起不到预期作用。
修正后的XSD断言
把第一个断言替换成以下内容,同时修正第二个断言的逻辑漏洞:
<xs:element name="terms"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="term"/> </xs:sequence> <!-- 修正后的核心断言 --> <xs:assert test="if (contains(../freeText, 'cow')) then exists(term[. = 'cow']) else true()"/> <!-- 修正第二个断言的逻辑:确保存在farm时必须存在animal --> <xs:assert test="if (exists(term[. = 'farm'])) then exists(term[. = 'animal']) else true()"/> </xs:complexType> </xs:element>
关键说明
- 字段名修正:将
../description改为../freeText,匹配XML中的实际字段。 - 存在性判断:用
exists(term[. = 'cow'])检查当前terms下是否有值为cow的term,这是XSD断言中判断节点存在的标准写法,比直接写term = 'cow'更严谨(多节点场景下后者会返回布尔序列,不符合断言对单个布尔值的要求)。 - 分支逻辑简化:当
freeText不包含cow时,直接返回true(),表示该校验规则不触发,无需额外限制。
另外注意你提供的XML里第一个<terms>的闭合标签写错了,应该是</terms>而非</term>,这个语法错误也可能干扰校验,记得修正。
内容的提问来源于stack exchange,提问作者jmwink
相关产品推荐
相关产品推荐

