Xml 基于测试元素类型属性值的参数验证

Xml 基于测试元素类型属性值的参数验证,xml,xsd,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">

下面给出了两个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文件的问题

  • 是否可以使用单个xml模式验证这两个xml文件
  • 当测试元素的type属性的值为“survey”时,在xml中,我需要一个参数,如第一个xml中所示

  • 当test元素的type属性的值为“test”时,在xml中,我需要有两个参数,如第二个xml中所示

  • 我还想使用相同的模式验证参数的值


  • 任何人都可以帮助我编写验证这些xml文件的模式。

    对于此类规则,您需要XSD 1.1或XSD 1.0的一些扩展,如Schematron

    下面的XSD 1.1模式验证了您提供的示例XML,并考虑了使用XSD 1.1断言列出的规则。如果删除
    ,它将在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>