我有两个xml文件,如下所示。
<!-- First XML -->
<?xml version="1.0"?>
<test type="survey">
<parameter name="surveyname">Survey</parameter>
</test>
<!-- Second XML -->
<?xml version="1.0"?>
<test type="test">
<parameter name="mode">Normal</parameter>
<parameter name="rdttype"></parameter>
</test>
以下是关于使用xml架构验证上述xml文件的问题。
当test元素的type属性值为“survey”时,在xml中我需要在第一个xml中给出一个参数。
当test元素的type属性值为“test”时,在xml中我需要有第二个xml中给出的两个参数。
我还想使用相同的架构验证参数的值。
任何正文都可以帮我编写用于验证这些xml文件的模式。
答案 0 :(得分:0)
对于这种规则,您需要XSD 1.1或XSD 1.0的某些扩展,例如Schematron。
下面的XSD 1.1模式根据您使用XSD 1.1断言列出的规则验证您提供的示例XML。如果删除<xs:assert>
它将在XSD 1.0中起作用,但您必须提供一些其他方法来强制执行规则。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
<xs:element name="test">
<xs:complexType>
<xs:sequence>
<xs:element name="parameter" maxOccurs="2">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="mode" />
<xs:enumeration value="surveyname" />
<xs:enumeration value="rdttype" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="type" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="test" />
<xs:enumeration value="survey" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:assert test="(@type = 'survey'
and count(parameter) = 1
and parameter/@name = 'surveyname'
and parameter = 'Survey')
or (@type = 'test'
and count(parameter) = 2
and parameter[1]/@name = 'mode'
and parameter[1] = 'Normal'
and parameter[2]/@name = 'rdttype'
and parameter[2] = '')"/>
</xs:complexType>
</xs:element>
</xs:schema>