On jeu, 2005-06-16 at 10:18 +0200, Frédéric Glorieux wrote:
> Merci pour cette réponse publique, qui a d'autant plus de poids lorsque
> l'on connaît votre compétence et votre indépendance à l'égard des
> langages de schémas
> <http://www.oreillynet.com/cs/catalog/view/au/853?x-t=book.view>.
>
Merci :-) !
> >><record>
> >> <dc:title xml:lang="fr"/><!-- obligatoire -->
> >> <dc:title xml:lang="en"/><!-- obligatoire -->
> >> <dc:title xml:lang="autre"/><!-- répétable, optionnel -->
> >></record>
>
>
> > Non, ce n'est pas possible avec W3C XML Schema, vous aurez une erreur du
> > type :
> >
> > ++++++++++++++++++++++++++++++++++++++++++++++
> > Description: E cos-element-consistent: Error for type
> > '#AnonType_record'. Multiple elements with name 'title', with different
> > types, appear in the model group.
> > URL: http://www.w3.org/TR/xmlschema-1/#cos-element-consistent
> > ++++++++++++++++++++++++++++++++++++++++++++++
>
> Oui, c'est bien ce que j'ai compris, ce qui d'ailleurs n'est pas
> arbitraire. En DTD on aurait certainement fait quelque chose comme
> <title-fr/>, <title-en/>, <title-xx/> ?
Oui, cette contrainte existait également avec les DTDs avec beaucoup
plus de poids puisque les définitions d'éléments étaient toutes
globales.
D'une manière générale, je ne suis pas partisan de l'utilisation de
définitions différentes des types d'éléments en fonction du contexte :
ces redéfinitions compliquent beaucoup la compréhension d'un vocabulaire
XML. Par contre dans le cas particulier que vous citez, elles semblent
assez légitimes.
> > Par contre, avec RELAX NG :
> >
> > element record {
> > element dc:title {
> > attribute xml:lang { "fr" }
> > },
> > element dc:title {
> > attribute xml:lang { "en" }
> > },
> > element dc:title {
> > attribute xml:lang { "autre" }
> > } *
>
> Disons plutôt un code ISO au lieu de "autre", mais en effet, c'est très
> clair.
Effectivement et dans ce cas, vous pourriez même exclure les valeurs
"fr" et "en" :
element record {
element dc:title {
attribute xml:lang { "fr" }
},
element dc:title {
attribute xml:lang { "en" }
},
element dc:title {
attribute xml:lang { xsd:language - ("fr" | "en") }
} *
}
Pour être tout à fait honnête, il est possible avec W3C XML Schema de
vérifier (en utilisant xs:unique) que vous ne répétez pas une valeur de
xml:lang et cela est impossible avec RELAX NG.
> > ne pose pas de problème :-) ...
>
> Et bien voilà, c'est dit. Pour valider un enregistrement Dublin Core,
> pensez aussi à Relax NG.
Ou à Schematron qui peut faire ce type de contrôle "métiers" en
complément d'une DTD, un schéma W3C XML Schema ou RELAX NG.
Dans ce cas on écrirait :
<sch:schema xmlns:sch="http://www.ascc.net/xml/schematron">
<sch:pattern name="languages">
<sch:rule context="record">
<sch:assert test="dc:title[1]/@xml:lang = 'fr'">Le premier élément dc:title doit être en
français</sch:assert>
<sch:assert test="dc:title[2]/@xml:lang = 'en'">Le deuxième élément dc:title doit être
en anglais</sch:assert>
</sch:rule>
</sch:pattern>
</sch:schema>
Ce n'est pas plus compliqué et on maîtrise totalement les messages
d'erreurs qui sont affichés.
Autre avantage : cela permet de ne pas avoir à redéfinir le type de
l'élément dc:title en fonction de son contexte (voir plus haut)...
Vous pouvez également vérifier l'unicité des attributs xml:lang avec la
règle :
<sch:rule context="dc:title">
<sch:report test="@xml:lang = preceding-sibling::dc:title/@xml:lang">Les titres
(dc:title) doivent être uniques pour chacun des langages.</sch:report>
</sch:rule>
En compliquant un peu, vous pouvez afficher des informations sur le
contexte lié à cette erreur.
Eric
PS: RELAX NG et Schematron sont maintenant des standards ISO.
--
Read me on XML.com.
http://www.xml.com/pub/au/74
------------------------------------------------------------------------
Eric van der Vlist http://xmlfr.org http://dyomedea.com
(ISO) RELAX NG ISBN:0-596-00421-4 http://oreilly.com/catalog/relax
(W3C) XML Schema ISBN:0-596-00252-1 http://oreilly.com/catalog/xmlschema
------------------------------------------------------------------------
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Received on Thu Jun 16 10:37:53 2005