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

如何用XSD约束XML中row元素id从1递增至指定count值?

XML序列校验:row元素ID与计数匹配的实现

校验需求

XML中存在表示计数的整数元素<meta/count>(记为n),需满足以下约束:

  • <data>节点下的<row>元素总数量等于n
  • <row>元素的id属性从1开始,依次递增1,直到n

示例XML

<root>
  <meta>
    <count>3</count>
  </meta>
  <data>
    <row id="1">2.1</row>
    <row id="2">3.6</row>
    <row id="3">5.4</row>
  </data>
</root>

实现思路

由于XSD无法在子元素的校验规则中访问兄弟节点的值,因此需要将所有校验逻辑放在<root>元素层级。虽然不能直接用<meta/count>的值作为<row>的maxOccurs属性,但可以通过xs:assert断言实现三个核心约束:

  1. 校验<row>元素的总数量等于<meta/count>的值
  2. 校验所有<row>的id属性最大值等于<meta/count>的值
  3. 校验每个位置的<row>的id属性等于其在序列中的序号(第1个<row>的id为1,第2个为2,以此类推)

XSD校验代码

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
xmlns:xerces="http://xerces.apache.org" vc:minVersion="1.1">
            <xs:element name="row">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:float">
                            <xs:attribute name="id" use="required" type="xs:positiveInteger"/>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
<xs:element name="root">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="meta">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="count" type="xs:positiveInteger"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="data">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element maxOccurs="unbounded" ref="row"/>
                        <!-- <xs:element maxOccurs="root/meta/count" ref="row"/> -->
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:assert test="count(data/row) = meta/count"/>
        <xs:assert test="max(data/row/@id) = meta/count"/>
        <xs:assert test="every $x in (1 to meta/count) satisfies data/row[$x]/@id = $x"
                       xerces:message="Rule #2.1: attribute id shall start at 1 and go up till @total value."/>
    </xs:complexType>
    </xs:element>
</xs:schema>

内容的提问来源于stack exchange,提问作者FordPrefect

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:42:37