我对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?
答案 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中,您可以使用断言来解决这个问题。