属性类型

时间:2013-07-23 16:42:59

标签: xml xsd

我希望能够像这样创建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>

如何定义属性“Type”只能来自架构内置数据类型?我不想用所有可能的类型创建自己的枚举。 通过这个我想实现没有人能够写:

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

2 个答案:

答案 0 :(得分: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的实现。

答案 1 :(得分:0)

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