いくつかのオプションを 1 つのスキーマに結合し、それを使用していくつかのテスト要素を検証しようとしました。
ソース:
http://www.w3schools.com/schema/schema_complex_empty.asp
http://www.herongyang.com/XML-Schema/complexType-Empty-Element-Declaration.html
スキーマ:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="foo">
<xs:complexType></xs:complexType>
</xs:element>
<xs:element name="y1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="0" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="y2">
<xs:complexType>
<xs:complexContent>
<xs:restriction base="xs:anyType" />
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
テストケース:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="NewXMLSchema.xsd">
<!-- These six are all valid -->
<foo />
<y1 />
<y2 />
<foo></foo>
<y1></y1>
<y2></y2>
<!-- These three are all invalid! -->
<foo>
</foo>
<y1>
</y1>
<y2>
</y2>
<!-- These are invalid too. -->
<foo>invalid</foo>
<y1>invalid</y1>
<y2>invalid</y2>
</root>
余分な空白行機能を除いて、3 つの要素宣言のいずれでも希望どおりに動作するように見えます。
type="xs:string"、fixed=""、または nillable="true" は含めません。これらはすべて空のタグとは意味的に異なるためです。空のタグは空であるため、実際には型 (文字列など) を持ちません。また、空であることとは異なるため、null 文字列の固定値もありません。nillable 要素は、意味的に空のタグとは異なります。これは、タグが存在しないことと意味的に同等であるためです (出典: Michael Kay による XSLT 2.0 および XSLT 2.0 Programmer's Reference、p. 182.)。空のタグ like<br/>
は、この場合、改行がないことを意味しません。これは、改行が存在するが、内容や属性がないことを意味します。