具有多个串联字段的 xsd:unique 示例?

Example of xsd:unique with multiple concatenated fields?

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

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

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

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

如果你们中的任何人有任何指导,我将不胜感激。

您可以使用 xs:unique 和多个 xs:fields 将它们的串联限制为唯一组合:

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

此处 xs:unique 中的 XSD 将验证您的 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>