XSD:向强类型“简单”元素添加属性

时间:2009-03-17 06:11:38

标签: xml excel xsd

是否有一些明智的方法来使用强类型简单类型和属性的元素?

好的,我有一个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

...但在理想世界中,我宁愿将其定义为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-"???"&gt;,因为我真的不在乎我在做什么;我想扩展所有类型。看起来像“xsd:anyType”是合适的,然后元素变成弱类型的容器呢?

b)我无法再在<xsd:element&gt;上指定简单类型,因为现在类型是我定义的复杂“customType”。因此,我放在那里想象中的“baseType”属性......

那么我可以用非笨重的方式向简单类型添加属性吗?或者我是否需要定义十几个复杂类型,除了它们扩展的简单类型外,它们都是相同的?

强类型元素不仅更合理地描述数据,而且当我在Excel中使用它们进行XML映射时(这是这些事情背后的全部目的),强类型意味着Excel正确设置单元格格式关于类型。

我可能正在以错误的方式看待它!任何建议表示赞赏。

3 个答案:

答案 0 :(得分:4)

您认为手动解决方案的哪个方面很糟糕,这一点并不完全清楚;如果只是因为他们需要扩展 n 不同的基类型而必须定义 n 不同类型的想法,那么你就会陷入困境。

如果想要为formatisVisible属性设置 n 不同的声明,那么您可能会发现使用命名属性组不太可怕持有这些定义:

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

您需要的各种复杂类型的声明仍然重复,但现在略显冗长:

<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" />

答案 1 :(得分:3)

  
    

[quote]可以手动完成,而且非常可怕     将所有此类属性添加到XSD     当我生成它时,像     此:[/报价]

  

我担心这是你唯一的“正确的”XSD架构兼容方式。

XSD有时会令作者感到困惑 - 但它有助于确保安全: - )

马克

答案 2 :(得分:1)

XSD的目的是描述您的数据。 XSD的type属性的目的是描述或定义元素。你想要做的是改变元素的定义。如果您要更改说明,请更改类型。你要做的就是把想法放在轮子上。 “但是我希望轮到我的想法!” “对不起,没有办法。”