[Relax-NG] Héritage ou dérivation de type ?

[email protected] Mon, 28 Apr 2008 17:19:05 +0200
Newsgroups gmane.text.xml.french.tech
Message-ID <[email protected]>
Bonjour,

Y'a t'il un mécanisme se rapprochant de l'héritage dans relax-ng.

D'après ce que j'ai lu sur le net, non... mais j'aimerais savoir s'il existe un
moyen élégant de représenter des structures proches en "factorisant" l'écriture
du schéma.

En simplifiant un peu mon problème, voici les types que je dois décrire.

<define name="t_table_a">
    <element name="table">
        <element name="row"><text /></element>
        <element name="row"><text /></element>
        <element name="row"><value>A</value></element>
    </element>
</define>

<define name="t_table_b">
    <element name="table">
        <element name="row"><text /></element>
        <element name="row"><text /></element>
        <element name="row"><value>B</value></element>
    </element>
</define>

...

<define name="t_table_z">
    <element name="table">
        <element name="row"><text /></element>
        <element name="row"><text /></element>
        <element name="row"><value>Z</value></element>
    </element>
</define>

Pour l'instant, la seule factorisation que j'ai trouvée :

<define name="t_table_row">
        <element name="row"><text /></element>
</define>

<define name="t_table_a">
    <element name="table">
        <ref name="t_table_row" />
        <ref name="t_table_row" />
        <element name="row"><value>A</value></element>
    </element>
</define>

<define name="t_table_b">
    <element name="table">
        <ref name="t_table_row" />
        <ref name="t_table_row" />
        <element name="row"><value>B</value></element>
    </element>
</define>

...

<define name="t_table_z">
    <element name="table">
        <ref name="t_table_row" />
        <ref name="t_table_row" />
        <element name="row"><value>Z</value></element>
    </element>
</define>

C'est mieux que rien, mais je ne suis pas complétement satisfait car je répète
le motif de ma table.

N'y a t'il pas un mécanisme de dérivation de type ?

J'ai vu qu'avec le include on pouvait redéfinir un type. J'aurais donc pu faire
:

<define name="t_table_row">
        <element name="row"><text /></element>
</define>

<define name="t_table_row2">
        <element name="row"><text /></element>
</define>

<define name="t_table">
    <element name="table">
        <ref name="t_table_row" />
        <ref name="t_table_row" />
        <ref name="t_table_row2" />
    </element>
</define>

et redéfinir t_table_row2 afin d'obtenir l'équivalent de mes t_table_a,
t_table_b, ...

Malheureusement cela ne me convient pas car je ne peux pas définir explicitement
t_table_a, t_table_b, ... et cela m'oblige à les utiliser dans des fichiers
séparés.

Tout commentaire sur mon schéma est le bienvenu. Par contre, je ne peux pas
changer la structure de mon XML car mes documents sont au format Docbook. Ou
plutôt mon schéma doit me permettre de définir un sous-ensemble de Docbook.

Merci d'avance.

Xavier