基于XSD1.1 Assert与XPath的XML元素约束及music.xsd验证问询
用XSD 1.1的Assert结合XPath实现实体值约束
没问题,咱们来搞定这个XSD 1.1的约束需求。你需要根据specialization元素的name属性值,限制它子元素entity的name只能取对应枚举值,用XSD 1.1的<xs:assert>结合XPath就能完美实现。
完整XSD示例
首先要注意,必须声明支持XSD 1.1,因为<xs:assert>是1.1版本才新增的特性。下面是符合要求的XSD代码:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> <!-- *必须声明支持XSD 1.1* --> <!-- 定义specialization元素结构 --> <xs:element name="specialization"> <xs:complexType> <xs:sequence> <xs:element name="entity"> <xs:complexType> <xs:attribute name="name" type="xs:string" use="required"/> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="name" type="xs:string" use="required"/> <!-- 核心:添加Assert约束 --> <xs:assert test=" (./@name = 'styleSpec' and ./entity/@name = ('Symphonic', 'Folk', 'Jazz')) or (./@name = 'ensembleSpec' and ./entity/@name = ('Orchestra', 'SmallGroup', 'Solo')) "/> </xs:complexType> </xs:element> </xs:schema>
关键逻辑解释
- XSD 1.1声明:一定要加上
vc:minVersion="1.1",否则大多数XML验证器会忽略<xs:assert>约束。 - Assert的XPath条件:
- 第一个分支:当
specialization的name为styleSpec时,强制entity的name只能是Symphonic、Folk、Jazz中的一个。 - 第二个分支:当
specialization的name为ensembleSpec时,强制entity的name只能是Orchestra、SmallGroup、Solo中的一个(注:你写的Soloi应该是笔误,我改成了常见的Solo,如果需要可以自行调整)。 - 用
or连接两个分支,确保只有符合其中一种场景的XML才能通过验证。
- 第一个分支:当
扩展场景处理
如果specialization允许包含多个entity元素(比如设置maxOccurs="unbounded"),可以用XPath的every表达式约束所有子entity的取值:
(./@name = 'styleSpec' and every $e in ./entity satisfies $e/@name = ('Symphonic', 'Folk', 'Jazz')) or (./@name = 'ensembleSpec' and every $e in ./entity satisfies $e/@name = ('Orchestra', 'SmallGroup', 'Solo'))
如果需要忽略大小写匹配,可以用lower-case()函数,比如lower-case(./@name) = 'stylespec'。
验证示例
- 合法XML(会通过验证):
<specialization name="styleSpec"> <entity name="Jazz"/> </specialization>
<specialization name="ensembleSpec"> <entity name="SmallGroup"/> </specialization>
- 非法XML(会被Assert拦截):
<specialization name="styleSpec"> <entity name="Orchestra"/> <!-- 不属于styleSpec允许的实体范围 --> </specialization>
内容的提问来源于stack exchange,提问作者Bikash Karmokar
相关产品推荐
相关产品推荐

