这是否是声明不能包含子元素或其他内容的XML元素Foo的正确方法?
<xs:element name="Foo" type="xs:string" fixed="" nillable="true" />
XML文档中此元素的有效示例如下:
<Foo></Foo>
和
<Foo/>
其他任何东西都是无效的,例如:
<Foo>stuff</Foo>
以下是有效的
,但不是必不可少的<Foo>
</Foo>
答案 0 :(得分: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>
看起来三个元素声明中的任何一个都可以做你想要的,除了额外的空行功能。
我不会包含type =“xs:string”,fixed =“”或nillable =“true”,因为它们在语义上都与空标签不同。空标记实际上不具有类型(如字符串),因为它是空的。它也没有固定的空字符串值,因为它与空的不同。 nillable元素在语义上与空标记不同,因为它在语义上等同于不存在的标记(来源:Michael Kay的XSLT 2.0和XSLT 2.0程序员参考,第182页)。像<br/>
这样的空标记并不意味着,在这种情况下,不存在换行符。这意味着换行符存在但没有内容或属性。
答案 1 :(得分:0)
有两种方法可以定义强制执行空内容的类型:一种是使用简单类型的xs:string,它使用枚举或模式facet(或使用fixed)约束为零长度;另一种是使用定义为(例如)空元素序列的复杂类型。出于验证目的,它们之间没有太多选择;但如果您对使用模式进行更高级的操作感兴趣,比如定义类型层次结构和替换组,或者将模式映射到Java对象模型,那么它可能会对您选择产生影响。
答案 2 :(得分:-1)
<xs:element name="Foo">
<xs:complexType>
<xs:attribute name="Bar" type="xs:positiveInteger"/>
</xs:complexType>
</xs:element>
您可以省略属性标记以使其完全为空......