有没有一种明智的方法,可以既拥有强类型简单类型元素,又拥有属性?
好的,我有一个 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: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根据类型正确设置单元格格式。
我可能完全错了!任何建议都将不胜感激。