xsd的示例:具有多个连续字段的唯一字符?

时间:2016-07-22 20:10:00

标签: xml xsd

我的任务是为我的测试框架创建一个模式,验证一个属性和一个元素组合在一起形成一个唯一的对。在向您展示示例XML段之后,我会更好地解释一下。

  <Test name="testName" dll="testDLL" active="true" >
    <model cad_sys="targetSystem" dir="directory">
      <name>modelName</name>
    </model>
  </Test>

在这种情况下,我们感兴趣的两个项目是testName和modelName。理想情况下,这是测试用例的流程

  • testName =&#34; Test1&#34;,modelName =&#34; Model1&#34; - 很好
  • testName =&#34; Test1&#34;,modelName =&#34; Model2&#34; - 很好
  • testName =&#34; Test2&#34;,modelName =&#34; Model1&#34; - 很好
  • testName =&#34; Test1&#34;,modelName =&#34; Model1&#34; - 将标志重复提升

现在,我已经尝试过这个,并且已经学到了很多我不知道的模式,但是我对如何解决这个问题感到有点难过它的。

如果你们有任何指导,我们非常感激。

1 个答案:

答案 0 :(得分:1)

您可以使用xs:unique和多个xs:fields将其连接限制为唯一组合:

    <xs:unique name="testNameModelNameUnique">
      <xs:selector xpath="Test"/>
      <xs:field xpath="@name"/> 
      <xs:field xpath="model/name"/>
    </xs:unique>

XSD中的xs:unique来验证您的XML并强制执行约束:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           elementFormDefault="qualified">
  <xs:element name="Tests">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Test" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
    <xs:unique name="testNameModelNameUnique">
      <xs:selector xpath="Test"/>
      <xs:field xpath="@name"/> 
      <xs:field xpath="model/name"/>
    </xs:unique>
  </xs:element>
  <xs:element name="Test">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="model">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="cad_sys" type="xs:string"/>
            <xs:attribute name="dir" type="xs:string"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="active"  type="xs:boolean"/>
      <xs:attribute name="dll" type="xs:string"/>
      <xs:attribute name="name" use="required" type="xs:string"/>
    </xs:complexType>
  </xs:element>
</xs:schema>