通过XSD检查属性是否有某些值

时间:2016-03-22 17:34:01

标签: xml xsd xsd-validation xml-validation

我有这样的XML:

...
<result name="Result" test="xpto" cat="2"/>
<result name="ExecuteTest" test="xpto"/>
<result name="Result" test="xpto" cat="1"/>
<result name="CloseTest" test="xpto"/>
...

我目前的XSD是这样的:

<xs:element name="result" maxOccurs="unbounded" minOccurs="1">
  <xs:complexType mixed="true">
    <xs:attribute type="xs:string" name="name" use="required"/>
    <xs:attribute type="xs:string" name="test" use="required"/>
    <xs:attribute type="xs:string" name="cat" use="optional"/>
  </xs:complexType>
</xs:element>

我想在我的XSD文件中验证,如果在我的XML文件中第一个元素<result>具有value="Result"并且具有属性cat="..."。有可能吗?

1 个答案:

答案 0 :(得分:0)

首先,XML不能有多个根元素,因此将result元素包装在一个共同的单个根元素中:

XML A

<results>
  <result name="Result" test="xpto" cat="2"/>
  <result name="ExecuteTest" test="xpto"/>
  <result name="Result" test="xpto" cat="1"/>
  <result name="CloseTest" test="xpto"/>
</results>

其次,使用具有name属性的通用元素名称的XML设计很差。相反,请考虑:

XML B

<results>
  <Result test="xpto" cat="2"/>
  <ExecuteTest test="xpto"/>
  <Result test="xpto" cat="1"/>
  <CloseTest test="xpto"/>
</results>

XSD可能性:

最后,决定上述XML设计之一以及您是否将使用XSD 1.0或1.1:

  • XSD 1.0无法代表您对XML A的约束。

  • XSD 1.0可以代表XML B所有Result元素必须 具有固定值的(必需或可选)cat属性 2

  • XSD 1.1可以代表您对带有条件的XML A的约束 键入Assignment,但也需要断言才能生成语句 关于定位。

  • XSD 1.1可以单独为XML A或XML B使用断言。