基于test元素的type属性值验证参数

时间:2014-04-03 10:43:00

标签: xml xsd

我有两个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文件的问题。

  1. 是否可以使用单个XML架构验证这两个xml文件?
  2. 当test元素的type属性值为“survey”时,在xml中我需要在第一个xml中给出一个参数。

  3. 当test元素的type属性值为“test”时,在xml中我需要有第二个xml中给出的两个参数。

  4. 我还想使用相同的架构验证参数的值。

  5. 任何正文都可以帮我编写用于验证这些xml文件的模式。

1 个答案:

答案 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>