0

我希望能够像这样创建 xml:

<Restaurant>
<Property Name="Bar" Value="true" Type="boolean"/>
<Property Name="Grill" Value="true" Type="boolean"/>
<Property Name="Capacity" Value="120" Type="integer"/>
<Property Name="Size" Value="200.5" Type="decimal" Unit="square meter"/>
</Restaurant>

所以我像这样创建了xsd:

<xs:complexType name="Restaurant">
   <xs:element name="Property" type="Property" minOccurs="0" maxOccurs="unbounded"/>
</xs:element> 

<xs:complexType name="Property">
   <xs:attribute name="Name" type="xs:string" use="required"/>
   <xs:attribute name="Value" type="xs:anySimpleType" use="required"/>
   <xs:attribute name="Type" type="xs:string" use="required"/>
   <xs:attribute name="Unit" type="xs:string" use="optional"/>
</xs:complexType>

如何定义该属性“类型”只能是模式内置数据类型中的一种?我不想用所有可能的类型创建自己的枚举。通过这个,我想实现没有人能够写:

<Property Name="Capacity" Value="120" Type="myOwnIntType"/>
4

2 回答 2

1

您想要设计的那种 XML 是 XSD 几乎不遗余力地阻止的设计。事实上,我看到人们使用结构的主要原因是

<Property Name="Bar" Value="true" Type="boolean"/>

而不是

<Bar>true</Bar>

是他们希望结构的描述成为数据的一部分,而不是在一个单独的模式中:两者兼而有之似乎有点矫枉过正。

所以,你不能用 XSD 1.0 来做。然而,XSD 1.1 对那些想以自己的方式而不是 XSD 的方式设计 XML 的人要宽容得多,并为这种用例引入了“条件类型分配”的构造:元素的类型可以取决于其属性之一的值。XSD 1.1 目前有两种实现,Saxon 和 Xerces。

于 2013-07-23T21:42:14.320 回答
0

Afaik 没有这样的枚举,在“Meta-XSD”(描述 XSD 的 XSD 文件)中,他们使用“xs:QName”作为类型。你试过了吗?

于 2013-07-23T18:45:11.683 回答