我想编写验证以下xml
的模式<labtest>
<labtest_id1>10190</labtest_id1>
<labtest_id2> 10200</labtest_id2>
<labtest_id3> 10220</labtest_id3>
</labtest>
标签<labtest_id>
的数量可能会增加或减少。我这样验证但它不起作用
<xs:element name="labtest" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="labtest_id" minOccurs="1" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
答案 0 :(得分:3)
如果你想强制实施labtest的所有子节点必须命名为labtest_N的约束,其中N是一个整数,那就是你无法用XSD做的事情(除非使用带有断言的XSD 1.1)。
这是一种使用XML的糟糕方式,最好的办法是首先使用XSLT将其转换为理想的东西,例如:
<labtests>
<labtest id='1'>10190</labtest>
<labtest id='2'>10200</labtest>
<labtest id='3'>10220</labtest>
</labtests>
然后使用XSD验证结果。
答案 1 :(得分:2)
按照Michael Kay的建议更改您的XML设计,并且仍然支持多个labtest
元素以及多个labtest_id
元素:
此XML,
<?xml version="1.0" encoding="UTF-8"?>
<labtests>
<labtest>
<labtest_id>10190</labtest_id>
<labtest_id>10200</labtest_id>
<labtest_id>10220</labtest_id>
</labtest>
<labtest>
<labtest_id>12345</labtest_id>
</labtest>
</labtests>
将成功验证此XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="labtests">
<xs:complexType>
<xs:sequence>
<xs:element name="labtest" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="labtest_id" minOccurs="1"
maxOccurs="unbounded" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
备注:强>
labtest
,但只能有一个根元素
在格式良好的XML中,所以添加一个labtests
包装元素。labtest_id
,因此请添加maxOccurs="unbounded"
它的声明。