【问题标题】:Example of xsd:unique with multiple concatenated fields?xsd 的示例:具有多个连接字段的唯一性?
【发布时间】:2016-07-23 07:46:47
【问题描述】:

我的任务是为我的测试框架创建一个模式,以验证一个属性和一个元素是否结合在一起并形成一个独特的对。在向您展示示例 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" - 将标记作为重复项

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

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

【问题讨论】:

  • 你是说Test/@nameTest/model/name连接必须是唯一的,或者它们的数字后缀不能匹配?
  • @kjhughes - 你是对的。与 Test/model/name 连接的 Test/@name 应该是唯一的。我们的框架报告测试的方式是使用两个连接的文件名。我发现它一直在覆盖结果,因为有些人对他们的测试/模型的命名没有那么小心,我决定引入架构来解决它。为混乱道歉

标签: xml xsd


【解决方案1】:

您可以使用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>

【讨论】:

    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2016-11-14
    相关资源
    最近更新 更多