Bonjour,

Voila j'ai un xml qui contient un namespace my: avec toute les balises aussi avec un my: est-il possible de l'enlever a l'aide d'un XSL sans rien changer a la structure?

Je sais pas trop comment procéder si vous pourriez me donner 2, 3 pistes ca serait génial

Merci d'avance

++

Thierry
Modifié par virgul (08 Jul 2005 - 08:52)
Slt,

essaye en faisant une copie de tous les noeuds et en rajoutant exclude-result-prefixes="my" sur <xsl:stylesheet/>.

++
Une petite remarque pour éviter une éventuelle confusion : il y a lieu de distinguer la notion de préfixe (par exemple :my) et la notion de namespace (par exemple : http://www.w3.org/1999/xhtml).

Il y a un rapport entre les 2 notions au sens ou il est possible de définir un mapping entre elles. Il faut savoir que ce mapping n'est pas bijectif (un namespace peut être associé à plusieurs préfixes) et qu'il n'est pas figé (il est différent d'un document à l'autre, et peut même évoluer au sein d'un document).

Lorsqu'il y a confusion celle ci vient souvent du fait qu'en pratique la notion de namespace est rarement directement accessible, et qu'elle ne peut être manipulé que via le mapping. Ainsi on a tendance à croire que les 2 notions n'en font qu'une, ce qui est faux bien sur, et problématique à bien des égards.

Ainsi, SirWam a indiqué comment supprimer un préfixe, et le titre du topic "enlever un préfixe" aurait été plus heureux.
Modifié par Xavier (20 Jun 2005 - 12:05)
Merci pour vos réponse mais ces temps je n'ai plus trop le temps de faire ca maintenant! Un autre projet a corriger...

Je vous tient au courant dés j'aurai eu le temps de tester!

Xavier merci pour la remarque! je connais bien la différence mais dans l'empressement je n'ai pas fait attention a cette erreur!

++

Thierry
Ok ben j'ai du mal comprendre! car moi ca ne me change rien du tout a mon xml d'arrivé!

alors mon XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="my" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-01-05T09:29:52">
	<xsl:template match="/">
		<xsl:copy-of select="*"/>
	</xsl:template>
</xsl:stylesheet>


un bout de mon xml:


<my:UrkundeAG2 >
	<my:Visum>MH</my:Visum>
	<my:Firma>Powerneting Sa</my:Firma>
	<my:Sitz>Neuchâtel</my:Sitz>
	<my:Urkundendatum>2005-06-22</my:Urkundendatum>
	<my [langue]raesident>fgsdjkl</my [langue]raesident>
	<my [langue]raesiSitz>fdsfjs</my [langue]raesiSitz>
	<my [langue]rotokollfuehrer />
	<my [langue]rotSitz />
	<my:BisherAktienkapital>43223434543</my:BisherAktienkapital>
	<my:Revisor>sdfkj</my:Revisor>
	<my:RevisorSitz>DVJSJKAVDF</my:RevisorSitz>
	<my:RevDatum>2001-01-01</my:RevDatum>
</my:UrkundeAG2>


Le seul truc qui ne revient pas se sont les PI de du programme avec lequel il faut le lancer par défaut(Microsoft Office Infopath)!

Trop cool mon xml vous avez vu ca Smiley langue ! ca marche aussi avec : P Smiley langue

Merci pour vos conseil!

++

Thierry
en fait exclude-result-prefixes supprime le prefixe (et l'espace de nom contrairement à ce que j'ai dit plus haut) pour les éléments litéraux (présents dans l'arbre de la feuille xsl).

En fait xsl:copy-of ne fait que reproduire un fragment d'arbre source sans le modifier, les noeuds d'espaces de noms sont également reproduits.

Il est donc nécessaire de ruser :
<xsl:template match="/" >
<xsl:apply-templates />
</xsl:template>
  <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>
Ben en faite après quelque test je me suis rendu compte que ton xsl mange les attribut et les met a l'intérieur de la balise!

ca:
<my:Strasse my:nr="153">Sagne-église</my:Strasse>


devient:
<Strasse>153Sagne-église</Strasse>


Une idée pour corriger ce bug?

Je cherche de mon coté !

++

Thierry
virgul a écrit :
Une idée pour corriger ce bug?
Ce n'est pas un bug. Ton fragment xml ne contenait pas d'attribut d'où ma réponse : pas de traitement spécifique aux attributs. Dans ce cas c'est le template par défaut qui s'applique qui se contente de recopier les noeuds textes.

Pour gérer les attributs ajoute simplement :
 <xsl:template match="@*">
    <xsl:attribute name="{local-name()}">
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>
Merci beaucoup!

Ouais c'est vrai c'est pas un bug mais excuse moi car je tape souvent trop vite mes message et je fais souvent des erreurs de nomination des choses! Je vais faire plus attention à l'avenir...

Et tout cas merci pour ton aide qui me fut plus qu'utile!


++

Thierry
Re,

Ouais ben j'aiencore un petit problème :

J'ai un xml:lang="fr" et un my:lang="2" le problème est que je voudrais garder le second et pas le premier problème pour l'instant ca me fait le contraire (lang="fr") quelqu'un a une idée de comment contourner le problème? sachant que si le premier disparait ca m'arrange!

Merci pour vos idées!

Je continue a chercher de mon coté!

++

Thierry
Modifié par virgul (24 Jun 2005 - 09:30)
J'ai réussi a contourner le problème des deux lang j'en ai mis un en majuscule!

Mais maintenant ma question est la suivante?

Est-il possible d'exclure un préfixe de namespace de la transformation ?

genre ignorer tout ceux qui on un préfixe xml: ?

je remets le xsl complet (a noter que le namespace principale n'est plus my: mais ns1: ):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-06-14T14-11-47" exclude-result-prefixes="ns1">
	<xsl:template match="/" >
<xsl:apply-templates />
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>


Il n'y en a que un a enlevé mais j'aimerais bien pouvoir utiliser ce xsl sur n'importe quelle xml!
un extrait du xml:
<?xml version="1.0" encoding="UTF-8"?><ns1:Case ns1:Gnr="0" ns1:Gyear="0" ns1:Nr="0" ns1:Kanton="NW" ns1:Amt="150" ns1:SitzNr="1509" ns1:CHNR="" ns1:RF="0" ns1:Eingang="2005-07-06" ns1:Termin="2005-07-16" ns1:Zuteilung="2005-07-06" ns1:valid="1" ns1:inBearb="1" ns1:Stempel="2005-07-06T11:01:52" ns1:Visum="EXP" xmlns:ns1="http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-06-14T14-11-47" xml:lang="fr">
	<ns1:Geschaeft>
		<ns1:Firma>Virgul Engineering </ns1:Firma>
		<ns1:Bemerkung>Radiation d'office</ns1:Bemerkung>
		<ns1:Notizen>
			<ns1:Notiz>DFDG DFG DSJAS OPGIHFGOFDHOGPS</ns1:Notiz>
		</ns1:Notizen>
		<ns1:Sitz ns1:bfs="1509">Hergiswil NW</ns1:Sitz>
		<ns1:Anmelder ns1:fldID="114">
			<ns1:Empfaenger>RGIOER</ns1:Empfaenger>
			<ns1:co>GSDFJ</ns1:co>
			<ns1:Strasse ns1:nr="234">GDFJG</ns1:Strasse>
			<ns1:Zusatz ns1:zusNr="43">FGIOSD</ns1:Zusatz>
			<ns1 [langue]LZ>543</ns1 [langue]LZ>
			<ns1:Ort>fgiosd</ns1:Ort>
			<ns1:fullText></ns1:fullText>
		</ns1:Anmelder>
	</ns1:Geschaeft>
	<ns1:Search>
		<ns1:SearchAIM></ns1:SearchAIM>
	</ns1:Search>
</ns1:Case>


Merci pour votre aide !!!

++

Thierry
Après quelque recherche et un peu d'aide extérieur j'ai enfin trouvé ma solution :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://schemas.microsoft.com/office/infopath/2003/myXSD/2005-06-14T14-11-47" exclude-result-prefixes="ns1">
	<xsl:template match="/">
		<xsl:apply-templates/>
	</xsl:template>
	<xsl:template match="*">
		<xsl:element name="{local-name()}">
			<xsl:apply-templates select="@*|node()"/>
		</xsl:element>
	</xsl:template>
	<xsl:template match="@ns1:*">
		<xsl:attribute name="{local-name()}"><xsl:value-of select="."/></xsl:attribute>
	</xsl:template>
	<xsl:template match="@xml:*"/>
</xsl:stylesheet>


Merci pour votre aide!

++

Thierry