XSD用于相同标记的不同属性名称

时间:2015-05-07 17:35:50

标签: xml xsd

我对xml有一些奇怪的情况,并希望使用xsd验证它。 下面是xml

<tag1>
   <tag2 attribute1="value1" />
   <tag2 attribute2="value2" />
<tag1>

以下是我正在使用的xsd

<xs:element name="tag1">
  <xs:complexType>
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="unbounded" name="tag2">
        <xs:complexType>
          <xs:attribute name="attribute1" type="xs:string" use="optional" />
          <xs:attribute name="attribute2" type="xs:string" use="optional" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

如果tag2同时具有attribute1或attribute2中的任何一个,那么一切正常。 但我的情况是,如果没有带有attribute1的tag2,如下所示

<tag1>
   <tag2 attribute2="value2" />
<tag1>

它应被视为无效,但

<tag1>
   <tag2 attribute1="valueX" />
<tag1>

有效。

是否可以构建一个可以验证此方案的XSD?

2 个答案:

答案 0 :(得分:1)

我不确定我理解,但为什么不简单地声明需要使用attribute1而不是可选?

 <xs:element minOccurs="1" maxOccurs="unbounded" name="tag2">
    <xs:complexType>
      <xs:attribute name="attribute1" type="xs:string" use="required" />
      <xs:attribute name="attribute2" type="xs:string" use="optional" />
    </xs:complexType>
 </xs:element>

然后,没有tag2属性的attribute1元素将被视为无效。

答案 1 :(得分:1)

我不确切地知道你想要强加什么规则,但是XSD 1.0中的一般规则是如果两个兄弟元素具有相同的名称,那么它们必须具有相同的类型(也就是说,你不能应用不同的验证对具有相同名称的两个兄弟元素的规则。)

当然,在XSD 1.1中,您可以使用断言来解决这个问题。