You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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>

关键逻辑解释

  1. XSD 1.1声明:一定要加上vc:minVersion="1.1",否则大多数XML验证器会忽略<xs:assert>约束。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:03:15