【发布时间】:2009-03-17 06:11:37
【问题描述】:
是否有一些明智的方法来让元素具有强类型的简单类型和属性?
好的,我有一个 XSD 架构,其中包含一百万个(呃,一百个)元素,可能看起来像这样:
<xsd:element name="DocumentDescription" type="xsd:string" />
<xsd:element name="DocumentDateTime" type="xsd:dateTime" />
<xsd:element name="DocumentSize" type="xsd:int" />
那是花花公子。但是,我真的希望所有这些元素也有一些共同的属性,比如“格式”和“isVisible”。即有这样的架构:
<DocumentDescription isVisible="true">doc description</DocumentDescription>
<DocumentDateTime format="dd/mm/yyyy" isVisible="true">1/1/2008</DocumentDescription>
<DocumentSize format="0.00 KB" isVisible="false">5403</DocumentSize>
我可以手动完成,非常可怕的是,在生成 XSD 时将所有此类属性添加到 XSD,如下所示:
<xsd:element name="DocumentDescription" />
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="format" type="xsd:string" />
<xsd:attribute name="isVisible" type="xsd:boolean" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:element name="DocumentDateTime" />
... etc
...但在理想世界中,我宁愿将其定义为 complexType:
<xsd:complexType name="customType">
<xsd:complexContent>
<xsd:extension base="???">
<xsd:attribute name="format" type="xsd:string" />
<xsd:attribute name="isVisible" type="xsd:boolean" />
...这意味着我可以这样做:
<xsd:element name="DocumentDescription" type="customType" baseType="xsd:string" />
<xsd:element name="DocumentDateTime" type="customType" baseType="xsd:dateTime" />
<xsd:element name="DocumentSize" type="customType" baseType="xsd:int" />
我的“理想世界”代码的问题在于:
a) 我没有有效的<xsd:extension base-"???">,因为我真的不在乎我在扩展什么;我想扩展所有类型。似乎“xsd:anyType”是合适的,但是元素变成了弱类型容器不是吗?
b) 我不能再在<xsd:element> 上指定简单类型,因为现在类型是我定义的复杂“customType”。因此,我放在那里的想象中的“baseType”属性......
那么我可以以一种不笨拙的方式为简单类型添加属性吗?或者我是否需要定义十几个除了它们扩展的简单类型之外都相同的复杂类型?
强类型元素不仅可以更合理地描述数据,而且当我将它们用于 Excel 中的 XML 映射时(这就是这些东西背后的全部目的),强类型意味着 Excel 根据正确设置单元格格式关于类型。
我可能看错了!任何建议表示赞赏。
【问题讨论】:
-
我取消了一个版本,该版本包括用内置简单类型 (W3C wording) 重命名所有出现的strongly-type。这样的措辞会帮助我找到你的问题。现在我不确定编辑是否值得,我很高兴我的评论包括这个措辞,所以我以后可以再次找到你的问题。