XSD:将属性添加到强types的“简单”元素

有没有一些明智的方法来使用强types的简单types和属性?

好的,我有一个XSD模式,它有一百万(呃,一百个)元素,可能看起来像这样:

<xsd:element name="DocumentDescription" type="xsd:string" /> <xsd:element name="DocumentDateTime" type="xsd:dateTime" /> <xsd:element name="DocumentSize" type="xsd:int" /> 

真是太棒了 不过,我真的希望所有这些元素都具有一些共同的属性,比如说“format”和“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 

但是在一个理想的世界中,我宁愿把它定义为复杂types:

 <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-"???" >,因为我真的不在乎我在做什么。 我想扩展所有types。 看起来像“xsd:anyType”是合适的,然后该元素成为一个弱types的容器不这样做?

b)我不能再在<xsd:element >上指定简单types,因为现在types是我定义的复杂的“customType”。 因此,我放在那里想象的“baseType”属性…

那么我可以以一种非笨重的方式将属性添加到简单的types吗? 还是我需要定义一些复杂的types除了它们扩展的简单types之外都是完全相同的?

强types的元素不仅更为合理地描述数据,而且当我将它们用于Excel中的XML映射(这是这些事物背后的全部目的)时,强types意味着Excel根据types正确设置单元格的格式。

我可能看着这一切都是错误的! 任何意见赞赏。

[quote]可以手动完成,可怕的是,在生成XSD的时候添加所有这些属性,如下所示:[/ quote]

恐怕这是您唯一的“正确的”,XSD架构兼容的方式来做到这一点。

XSD可能会被卷入作者的时间 – 但它有助于保持安全:-)

渣子

你认为手动解决scheme的哪一方面是不好的, 如果仅仅因为需要扩展n个不同的基本types而定义n个不同types的想法,那么你就被卡住了。

如果想要对formatisVisible属性进行n个不同的声明,那么使用命名属性组来保存这些定义可能会更糟糕:

 <xs:attributeGroup name="globals"> <xs:attribute name="format" type="xs:string"/> <xs:attribute name="isVisible" type="xs:boolean"/> </xs:attributeGroup> 

您需要的各种复杂types的声明仍然是重复的,但是现在略less一些:

 <xs:complexType name="string"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attributeGroup ref="my:globals"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name="dateTime"> <xs:simpleContent> <xs:extension base="xs:dateTime"> <xs:attributeGroup ref="my:globals"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name="int"> <xs:simpleContent> <xs:extension base="xs:int"> <xs:attributeGroup ref="my:globals"/> </xs:extension> </xs:simpleContent> </xs:complexType> 

而且你的元素的声明现在比你的“理想”情况稍微简单一些:

 <xs:element name="DocumentDescription" type="my:string" /> <xs:element name="DocumentDateTime" type="my:dateTime" /> <xs:element name="DocumentSize" type="my:int" /> 

XSD的目的是描述你的数据。 XSDtypes属性的目的是描述或定义一个元素。 你想要做的是改变元素的定义。 如果您更改说明更改types。 你想要做的就像把想法放在一边。 “但是我我的想法轮子! “对不起,不行。”