15 Stimmen

XSD: Hinzufügen von Attributen zu stark typisierten "einfachen" Elementen

Gibt es eine sinnvolle Möglichkeit, Elemente mit stark typisierten einfachen Typen und auch Attributen zu haben?

Okay, ich habe ein XSD-Schema, das eine Million (äh, hundert) Elemente hat, die so aussehen könnten:

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

Das ist prima. Allerdings möchte ich wirklich alle diese Elemente auch einige gemeinsame Attribute auf sie wie, sagen wir, "Format" und "isVisible" haben. d.h. haben ein Schema wie:

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

Ich könnte es manuell tun, und schrecklich, indem ich alle solche Attribute in die XSD, wenn ich es generieren, etwas wie dieses hinzufügen:

<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

...aber in einer idealen Welt würde ich es lieber als einen complexType definieren:

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

...was bedeutet, dass ich es einfach tun könnte:

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

Das Problem mit meinem "Idealwelt"-Code ist, dass:

a) Ich habe keine gültigen <xsd:extension base-"???" >, denn eigentlich ist es mir egal, was ich erweitere; ich möchte alle Typen erweitern. Es scheint, dass "xsd:anyType" angemessen ist, doch dann wird das Element zu einem schwach typisierten Container, nicht wahr?

b) Ich kann den einfachen Typ nicht mehr in der <xsd:element >, denn jetzt ist der Typ der komplexe "customType", den ich definiert habe. Daher das imaginäre Attribut "baseType", das ich dort eingefügt habe...

Kann ich also Attribute zu einfachen Typen hinzufügen, ohne dass es umständlich wird? Oder muss ich ein Dutzend complexTypes definieren, die bis auf den einfachen Typ, den sie erweitern, alle identisch sind?

Elemente mit starker Typisierung beschreiben nicht nur die Daten sinnvoller, sondern wenn ich sie für die XML-Zuordnung in Excel verwende (und das ist der eigentliche Zweck dieser Elemente), bedeutet die starke Typisierung, dass Excel die Zellformatierung auf der Grundlage des Typs korrekt einstellt.

Ich sehe das wahrscheinlich ganz falsch! Jeder Rat ist willkommen.

0 Stimmen

Ich habe eine Ausgabe annulliert, die in der Umbenennung aller Vorkommen von starker Typ mit eingebaute einfache Typen ( W3C-Wortlaut ). Eine solche Formulierung hätte mir geholfen, Ihre Frage zu finden. Jetzt bin ich mir nicht mehr sicher, ob die Bearbeitung sinnvoll ist, und ich bin froh über meinen Kommentar mit dieser Formulierung, damit ich Ihre Frage in Zukunft wiederfinden kann.

4voto

Es ist nicht ganz klar, welchen Aspekt der manuellen Lösung Sie als schrecklich empfinden; wenn es die Idee ist, dass man die n verschiedene Typen, nur weil sie die n verschiedene Grundtypen, dann sind Sie aufgeschmissen.

Wenn es die Vorstellung ist, dass man n verschiedene Deklarationen für die format y isVisible Attribute, dann ist es vielleicht weniger schrecklich, eine benannte Attributgruppe zu verwenden, um diese Definitionen zu speichern:

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

Die Deklarationen der verschiedenen komplexen Typen, die Sie benötigen, wiederholen sich weiterhin, sind jetzt aber etwas weniger ausführlich:

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

Und die Deklarationen Ihrer Elemente sind jetzt etwas einfacher als in Ihrem "Idealfall":

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

0 Stimmen

In XSD 1.1 gibt es ein Schema-Attribut namens defaultAttributes die eine Attributgruppe auf jeden complexType anwendet, sofern nicht defaultAttributesApply in diesem complexType auf false gesetzt ist. Dies funktioniert nicht für simpleTypes, aber mit Ihrem großartigen Ansatz müssten Sie zwei Zeilen weniger für jede complexType-Deklaration schreiben, da die Erweiterung ein selbst geschlossenes Tag sein kann <xs:extension base="xs:string"/>

3voto

marc_s Punkte 701497

[quote]könnte es manuell tun, und zwar auf schreckliche Weise, durch alle diese Attribute zur XSD hinzufügen hinzufügen, wenn ich sie generiere, etwa wie so:[/quote]

Ich fürchte, das ist die einzige "richtige", mit dem XSD-Schema kompatible Möglichkeit, dies zu tun.

XSD kann für den Autor manchmal etwas umständlich sein - aber es hilft, die Dinge sicher zu halten :-)

Marc

0 Stimmen

Verdammt! Nun, danke. Ich werde es vielleicht zuerst mit dem Dutzend identischer-except-for-extension-complexTypes versuchen, angesichts der Anzahl der Elemente wird die XSD dadurch zumindest kleiner, wenn auch hässlich!

1 Stimmen

@Gavin Es lohnt sich, einen Blick auf die attributeGroup Anregung von C. M. Sperberg-McQueen wenn Sie immer dieselbe Gruppe von Attributen hinzufügen

1voto

OldAndTired Punkte 11

Der Zweck einer XSD ist es, Ihre Daten zu beschreiben. Der Zweck eines XSD-Typ-Attributs ist die Beschreibung oder Definition eines Elements. Was Sie tun wollen, ist, die Definition des Elements zu ändern. Wenn Sie die Beschreibung ändern, ändern Sie den Typ. Was Sie versuchen, ist wie das Anbringen von Rädern an einem Gedanken. "Aber ich wollen Räder auf meinen Gedanken!" "Tut mir leid, das geht nicht."

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X