如果我在 xml 中有一个元素,它是一个表示计数的整数n
。如果我有一个元素,该元素带有一个元素序列,该序列的属性 id 应该从 1 开始一直到n
。
xsd 中是否有某种方法可以确保元素序列以属性 id=1 开始,并且在每个下一个元素上增加 1,并停止在另一个元素的值指定的数字处?
感谢您迄今为止的反馈。我将在下周查看。
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>
因此,meta.count 的值应该与行元素的总出现次数相匹配,并且这些元素应该从 1 开始直到 count 值。
我现在尝试了类似的事情并发现,由于我无法在测试中接触到兄弟姐妹,所以我需要将测试放到更高的元素上,这样才有效。
不过,我不能将其中一个元素的值用作 maxOccurs。但我可能可以为此创建第三个测试。编辑:是的,可以将行数与 count 的值进行比较。感谢您的支持。
<?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>