Skip to topic | Skip to bottom
Home

Tesi
Tesi.DppAttributeGroupr1.4 - 22 Sep 2005 - 15:28 - GiuliaGambinitopic end

Start of topic | Skip to actions

Attribute Group in DTD++

Riflessioni iniziali

Uno dei problemi di DTD++ e' che e' prassi nei DTD scrivere qualcosa tipo:

<!ENTITY % vigenza "
              inizio             IDREF                  #IMPLIED
              iniziosospensione  IDREF                  #IMPLIED
              finesospensione    IDREF                  #IMPLIED
              fine               IDREF                  #IMPLIED
              status             (omissis|abrogato|annullato|sospeso)     #IMPLIED
">
<!ENTITY % CMarticolo "(inlinemeta?, num?, rubrica?, decorazione?, comma*)">

<!ELEMENT articolo %CMarticolo;>
<!ATTLIST articolo %vigenza; >

Cioe' definiamo due entità parametriche, una per il content model e una per la lista di attributi, e nella definizione dell'elemento le usiamo come tipi dell'elemento (potendo riutilizzare lo stesso tipo per più elementi diversi con una definizione sola.

La conversione pura e semplice a XML Schema fa espandere la lista di elementi e attributi in un tipo complesso anonimo lunghissimo, che non vale neanche la pena considerare.

Il passaggio a DTD++ permette di mantenere qualcosa dell'eleganza dello schema DTD nel passaggio a XML Schema:

<!ENTITY # status "(omissis|abrogato|annullato|sospeso)" >
<!ENTITY % vigenza "
              inizio             IDREF                  #IMPLIED
              iniziosospensione  IDREF                  #IMPLIED
              finesospensione    IDREF                  #IMPLIED
              fine               IDREF                  #IMPLIED
              status             #status;               #IMPLIED
">
<!ENTITY @ CMarticolo "(inlinemeta?, num?, rubrica?, decorazione?, comma*)">

<!ELEMENT articolo @CMarticolo;>
<!ATTLIST articolo %vigenza; >

Qui abbiamo definito due tipi, uno semplice (status) e uno complesso, e li usiamo apparentemente secondo uno stile equivalente a quello XML Schema. Pero' la lista di attributi viene comunque espansa completamente nella definizione di articolo, perche' rimane un'entità parametrica tradizionale.

Un'alternativa potrebbe essere:

<!ENTITY # status "(omissis|abrogato|annullato|sospeso)" >
<!ENTITY % vigenza "
              inizio             IDREF                  #IMPLIED
              iniziosospensione  IDREF                  #IMPLIED
              finesospensione    IDREF                  #IMPLIED
              fine               IDREF                  #IMPLIED
              status             #status;               #IMPLIED
">
<!ENTITY @ CMarticolo "(inlinemeta?, num?, rubrica?, decorazione?, comma*)" "%vigenza;">

<!ELEMENT articolo @CMarticolo;>

che inserisce esplicitamente gli attributi nel tipo complesso CMarticolo. Questo non va male, eccetto che in molte situazioni abbiamo lo stesso content model ma attributi diversi, e dover definire altrettanti tipi diversi può diventare lungo. E' per questo che in XML Schema sono stati introdotti i group e gli attributeGroup.

Io vorrei reintrodurre gli attributeGroup nella sintassi DTD++. Scarterei l'uso di un'altra <!ENTITY perche' si sovraccarica il termine. Propongo invece di introdurre una nuova sintassi per <!ATTLIST, analoga a quella dei tipi semplici:

<!ENTITY # status "(omissis|abrogato|annullato|sospeso)" >
<!ATTLIST # vigenza 
              inizio             IDREF                  #IMPLIED
              iniziosospensione  IDREF                  #IMPLIED
              finesospensione    IDREF                  #IMPLIED
              fine               IDREF                  #IMPLIED
              status             #status;               #IMPLIED
>
<!ENTITY @ CMarticolo "(inlinemeta?, num?, rubrica?, decorazione?, comma*)">

<!ELEMENT articolo @CMarticolo;>
<!ATTLIST articolo #vigenza; >

In questa maniera definisco un attributeGroup chiamato "vigenza", globale, che contiene cinque attributi (locali). L'elemento articolo usa un tipo complesso (CMarticolo) per il content model, e l'attributeGroup "vigenza" per gli attributi.

Questo corrisponde a definire un tipo anonimo come estensione del tipo complesso a cui si aggiunge l'attributeGroup definito:

<element name="articolo">
  <complexType>
    <complexContent>
      <extension base="CMarticolo">
        <attributeGroup ref="vigenza"/>
      </extension>
    </complexContent>
  </complexType>
</element>

Riflessioni 17/5/05 --OK

La nuova sintassi per gli attributeGroup dovrebbe essere:


<!ENTITY ## HTMLattrs "
       class       #htmlclass;       #IMPLIED
       style       #htmlstyle;       #IMPLIED
       title       #anystring;       #IMPLIED">

<!ATTLIST ndr
   ##HTMLattrs; 
   num   #idref;     #IMPLIED
   value #anystring; #IMPLIED
>

deve diventare

    <xsd:attributeGroup name="HTMLattrs">
        <xsd:attribute name="class" type="htmlclass"/>
        <xsd:attribute name="style" type="htmlstyle"/>
        <xsd:attribute name="title" type="anystring"/>
    </xsd:attributeGroup>

    <xsd:element name="ndr">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="inline">
                    <xsd:attributeGroup ref="HTMLattrs"/>
                    <xsd:attribute name="num" type="idref"/>
                    <xsd:attribute name="value" type="anystring"/>
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>

mentre per i group deve essere come segue:


<!ENTITY @@ tuttiblocchi "h:div|h:p|h:img|h:ul|h:ol|h:table">

<!ELEMENT l1 (@gerarchiabase;, (@@tuttiblocchi; | l2 | l3 | l4 | l5 | l6 | l7 | l8 | l9)+)>
<!ELEMENT l9 (@gerarchiabase;, (@@tuttiblocchi;)+)>

deve diventare

   <xsd:group name="tuttiblocchi">
       <xsd:element ref="h:div"/>
       <xsd:element ref="h:p"/>
       <xsd:element ref="h:img"/>
       <xsd:element ref="h:ul"/>
       <xsd:element ref="h:ol"/>
       <xsd:element ref="h:table"/>
   </xsd:group>
   <xsd:element name="l1">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="gerarchiabase">
                    <xsd:choice minOccurs="1" maxOccurs="unbounded">
                        <xsd:group ref="tuttiblocchi"/>
                        <xsd:element ref="l2"/>
                        <xsd:element ref="l3"/>
                        <xsd:element ref="l4"/>
                        <xsd:element ref="l5"/>
                        <xsd:element ref="l6"/>
                        <xsd:element ref="l7"/>
                        <xsd:element ref="l8"/>
                        <xsd:element ref="l9"/>
                    </xsd:choice>
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>

-- FabioVitali - 08 Feb 2005
to top


You are here: Tesi > DeveloperCorner? > DppAttributeGroup

to top

Copyright © 1999-2019 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Fabio's Wiki? Send feedback