From: Eric van der Vlist (vdv@dyomedea.com)
Date: 07/10/2003 - 20:49
On Sat, 2003-10-04 at 21:19, Pierre Attar wrote:
> >BTW, pourquoi déclarer l'espace de noms FO dans une transformation vers
> >html ;-) ???
>
> Voir mon exemple précédent: J'ai un même fonction qui fait des choses
> communes tout en se spécialisant, quand nécessaire, en fonction d'un
> paramètre qui donne le type de sortie attendue : html, web ou docbook.
> On pourrait le voir autrement mais en termes de maintenance c'est plus
> facile car quand il faut changer quelque chose, je le change en même temps
> sur mes trois sorties.
Effectivement.
Pour en revenir au problème de départ, la transformation suivante
supprime les espaces de noms non utilisés :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:template match="@*|text()|processing-instruction()|comment()">
<xsl:copy/>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates
select="*|text()|processing-instruction()|comment()"/>
</xsl:element>
</xsl:template>
</xsl:transform>
On peut la passer en "deuxième passe" d'une transformation en utilisant
éventuellement la fonction exsl:node-set si on veut les enchaîner dans
une seule transformation.
On peut aller plus loin et chercher à reporter les déclarations sur la
racine du document. Cette transformation ne traite pas tous les cas mais
gère les cas les plus courants :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:template match="@*|text()|processing-instruction()|comment()">
<xsl:copy/>
</xsl:template>
<xsl:template match="/*">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:for-each select="//*/namespace::*">
<xsl:if test="not(preceding::*/namespace::*[name() =
name(current())]) and //*[starts-with(name(), concat(name(current()),
':'))] or //*/@*[starts-with(name(), concat(name(current()), ':'))]">
<xsl:copy/>
</xsl:if>
</xsl:for-each>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates
select="*|text()|processing-instruction()|comment()"/>
</xsl:element>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates
select="*|text()|processing-instruction()|comment()"/>
</xsl:element>
</xsl:template>
</xsl:transform>
Elle fonctionne avec Saxon et Xalan mais fait exploser libxslt
(Segmentation fault). Sans prétendre traiter tous les cas, elle
transforme le document :
<foo xmlns="http://foo" xmlns:foo="http://foo" xmlns:baz="http://bat">
<?foo bar="baz"?>
<!-- foo -->
<bar:bar xmlns:bar="http://bar"/>
<baz xmlns:baz="http://baz"/>
<bat xmlns:bat="http://bat" bat:bat="bat"/>
</foo>
en :
<foo xmlns="http://foo" xmlns:bar="http://bar" xmlns:bat="http://bat">
<?foo bar="baz"?>
<!-- foo -->
<bar:bar/>
<baz/>
<bat bat:bat="bat"/>
</foo>
Ce qui me semble être un bon début ;-) ...
Attention tout de même, ces transformations ne gèrent pas les noms
qualifiés (QNames) dans les valeurs d'éléments ou d'attributs et on
s'exposerait à des déboires si on les appliquait sur des transformations
XSLT ou des schémas W3C XML Schema!
Eric
--
Don't you think all these XML schema languages should work together?
http://dsdl.org
Upcoming schema tutorial:
- Philadelphia (7/12/2003) http://makeashorterlink.com/?V28612FC5
Tutoriel XSLT:
- Paris (25/11/2003) http://makeashorterlink.com/?L2C623FC5
------------------------------------------------------------------------
Eric van der Vlist http://xmlfr.org http://dyomedea.com
(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)
Archive générée par hypermail 2.1.3 le 28/06/2004 - 11:06 UTC
webmaster@xmlfr.org
|