具有多个串联字段的 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。理想情况下,这是测试用例的流程
- testName = "Test1",modelName = "Model1" - 很好
- testName = "Test1",modelName = "Model2" - 很好
- testName = "Test2",modelName = "Model1" - 很好
- testName = "Test1", modelName = "Model1" - 将作为副本升起标志
现在,我已经尝试解决这个问题,并且学到了很多我不知道的模式,但我对如何解决这部分问题感到有点困惑。
如果你们中的任何人有任何指导,我将不胜感激。
您可以使用 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>
我的任务是为我的测试框架创建一个模式,以验证一个属性和一个元素组合在一起并形成一对唯一的。在向您展示示例 XML 段后,我会更好地解释这一点。
<Test name="testName" dll="testDLL" active="true" >
<model cad_sys="targetSystem" dir="directory">
<name>modelName</name>
</model>
</Test>
在这个场景中,我们感兴趣的两个项目是 testName 和 modelName。理想情况下,这是测试用例的流程
- testName = "Test1",modelName = "Model1" - 很好
- testName = "Test1",modelName = "Model2" - 很好
- testName = "Test2",modelName = "Model1" - 很好
- testName = "Test1", modelName = "Model1" - 将作为副本升起标志
现在,我已经尝试解决这个问题,并且学到了很多我不知道的模式,但我对如何解决这部分问题感到有点困惑。
如果你们中的任何人有任何指导,我将不胜感激。
您可以使用 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>