有条件地选择相同的元素但具有不同的属性列表

时间:2013-10-30 20:59:18

标签: xml xsd

假设我有以下xml:

<root>
    <node attr1="1" />
    <node attr1="1" attr2="2"/>
    <node attr1="1" attr3="3"/>
</root>
除root之外的所有节点都需要

atrr1,但其他属性可以组合。允许的唯一组合是: 1. attr1本身 2. attr1,attr2 3. attr1,attr3

attr2和attr3不能组合在一起显示。

我一直在尝试使用xsd来尝试并有条件地评估属性的组合,但似乎几乎不可能,因为我不能将xsd文件中的多个元素命名为节点。有没有办法绕过这个或甚至有条件地检查属性组合?如果没有,有没有人看过工作?

1 个答案:

答案 0 :(得分:1)

您只能告诉它需要attr1,并且attr2和attr3是可选的。我不知道在XSD架构中定义(对于XML 1.0),你不能同时拥有attr2和attr3。 之后你必须有一些东西验证它以检查那个组合。

<?xml version="1.0" encoding="utf-16"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="node">
          <xs:complexType>
            <xs:attribute name="attr1" type="xs:int" use="required" />
            <xs:attribute name="attr2" type="xs:int" use="optional" />
            <xs:attribute name="attr3" type="xs:int" use="optional" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

编辑: 我遇到了另一个线程,其中有人想要像你一样进行一些复杂的验证,并在其中一条评论中提供了一个链接,这篇文章也谈到了Co-occurrence constraints这就是你所追求的并且是为1.1版本实现的。我也参考了这篇详细的文章XML Schema 1.1, Part 2: An introduction to XML Schema 1.1。不幸的是,XML 1.1似乎没有被广泛支持。