如何用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断言实现三个核心约束:
- 校验
<row>元素的总数量等于<meta/count>的值 - 校验所有
<row>的id属性最大值等于<meta/count>的值 - 校验每个位置的
<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
相关产品推荐
相关产品推荐

