views:

803

answers:

1

Is there some sensible way to have elements with strongly-typed simple-types and also attributes?

Okay, I have an XSD schema which has a million (er, hundred) elements that might look like this:

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

That's dandy. However, I really want all of these elements to also have some common attributes on them like, let's say, "format" and "isVisible". i.e. have a schema like:

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

I could do it manually, and horribly, by adding all such attributes to the XSD when I generate it, something like this:

<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

...but in an ideal world I'd rather define it as a complexType:

<xsd:complexType name="customType">
  <xsd:complexContent>
    <xsd:extension base="???">
      <xsd:attribute name="format" type="xsd:string" />
      <xsd:attribute name="isVisible" type="xsd:boolean" />

...which means I could just do:

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

The problem with my "ideal world" code is that:

a) I've no valid <xsd:extension base-"???">, since really I don't care what I'm extending; I want to extend all types. Seems like the "xsd:anyType" is appropriate, yet then the element becomes a weakly typed container does it not?

b) I can no longer specify the simple type on the <xsd:element>, since now the type is the complex "customType" I defined. Hence the imaginary "baseType" attribute I put there...

So can I add attributes to simple types in a non-clunky way? Or do I need to define a dozen complexTypes that are all identical except for the simple type that they extend?

Strongly-typed elements not only describe the data more sensibly, but when I use them for XML mapping in Excel (and this is the whole purpose behind these things), the strong-typing means that Excel sets the cell formatting correctly based on the type.

I'm probably looking at it all the wrong way! Any advice appreciated.

+2  A: 

Hi Gavin,

[quote]could do it manually, and horribly, by adding all such attributes to the XSD when I generate it, something like this:[/quote]

I'm afraid this is your only "proper", XSD-schema compatible way to do it.

XSD can be convoluted to author at times - but it helps keeping things safe :-)

Marc

marc_s
Damn! Well, thanks. I might give the dozen identical-except-for-extension-complexTypes a go first though, given the number of elements it will at least make the XSD smaller, albeit ugly!
Gavin Schultz-Ohkubo