![](/img/trans.png)
[英]If a schema requires an attribute and I send it as an element, is it invalid?
[英]Build XML schema that requires element or attribute, but not both
我想创建一个具有以下约束的XML模式:
list
。 list
包含一组node
元素。 node
元素可以具有value
属性。 node
元素可以包含value
元素。 node
元素只能(并且恰好 )具有一个value
属性或value
元素。 这是验证上述约束的有效XML的示例:
<?xml version="1.0" ?>
<list>
<node id="1" value="A" />
<node id="2">
<value>B</value>
</node>
</list>
我尝试了以下XSD架构:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="node" maxOccurs="unbounded" minOccurs="0">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element type="xs:string" name="value" minOccurs="0"/>
</xs:sequence>
<xs:attribute type="xs:byte" name="id" use="optional"/>
<xs:attribute type="xs:string" name="value" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
这个XSD模式验证了我的第一个和第二个约束,但没有验证第三个约束。
根据我的约束,以下XML示例无效,但是,对于我以前的XSD模式而言,它是有效的。
<?xml version="1.0" ?>
<list>
<node id="2" value="A" /> <!-- valid -->
<node id="4">
<value>D</value>
</node><!-- valid -->
<node id="1" /><!-- not valid, missing value -->
<node id="3" value="B">
<value>C</value>
</node><!-- not valid, both attribute and element are declared -->
</list>
如何更改架构以验证所有约束?
提前致谢。
使用XSD 1.0不可能做到这一点。
使用断言的XSD 1.1应该应该是可能的:
<xs:assert test="not(@value and value)"/>
如果@value
和value
都存在,则失败。 要检查是否只有一个属性或子元素,请使用:
<xs:assert test="count((value, @value))=1"/>
正如迈克尔·凯(Michael Kay)在评论中建议的那样。
使用其他一些XML验证技术(例如Schematron)可能是可能的。
您可以使用必需的属性创建第一种类型,并使用必需的元素创建第二种类型。 然后使用包含两种类型的选择合成器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.