Traitement des nœuds sélectionnés uniquement
Question
Un problème de débutant XSLT: je dois remplacer une valeur de texte dans un fichier XML. Tous les autres nœuds doivent rester inchangés. Voici mon fichier d'entrée (in.xml):
<?xml version="1.0" encoding="UTF-8"?>
<root>
<level1 attr1="val1">
<level2>in</level2>
</level1>
</root>
Voici ma transformation XSLT (subst.xsl):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="//node()">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="/root/level1/level2/text()">out</xsl:template>
</xsl:stylesheet>
Je l'exécute avec le script Ant suivant (build.xml):
<?xml version="1.0" encoding="UTF-8"?>
<project name="test" default="test" basedir=".">
<target name="test">
<xslt style="subst.xsl" in="in.xml" out="out.xml" />
</target>
</project>
Et voici ce que je reçois (out.xml):
<?xml version="1.0" encoding="UTF-8"?><root>
<level1>
<level2>out</level2>
</level1>
</root>
Attribut & attr; attr1 " de " niveau1 " est manquant.
Je serais très reconnaissant si quelqu'un
- dites-moi ce qui ne va pas avec subst.xsl
OU
- donnez-moi une idée de la procédure à suivre pour forcer xslt-processeur à copier simplement les nœuds non appariés dans le fichier de sortie et à le faire à la main (ce qui, dans mon cas, est sujet aux erreurs).
La solution
Il manque des attributs dans votre transformation d'identité (évidemment). Utilisez ceci à la place:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Ajoutez simplement votre dernier modèle.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow