![](/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.