2011-10-04 3 views
4

Je suis très nouveau sur XSL/XSLT. Je veux copier un document XML dans un autre, mais remplacez certains balises namespaced et certaines balises qui ont des attributs spéciaux. Par exemple:XSL: copiez XML et remplacez quelques balises

<root> 
    <ext:foo>Test</ext:foo> 
    <bar>Bar</bar> 
    <baz id="baz" x="test"> 
    <something/> 
    </baz> 
</root> 

devrait être reformulé en:

<root> 
    --Test-- 
    <bar>Bar</bar> 
    xxx<baz id="baz"> 
    <something/> 
    </baz>xxx 
</root> 

Est-il possible de copier le code XML entier et ensuite appliquer certaines règles pour remplacer les balises que je veux remplacer?

+0

Ce qui est possible est d'appliquer les règles que vous voulez en le réécrivant. – FailedDev

+0

Pourriez-vous s'il vous plaît me donner un exemple, comment je fais cela? – stofl

+1

Pour "copier tout avec quelques exceptions", vous utilisez le modèle d'identité (comme dans la réponse de Carl Raymond). Consultez également [cette page] (http://www.xmlplease.com/xsltidentity) pour d'autres exemples. –

Répondre

5

Vous pouvez copier des nœuds et réécrire d'autres avec des règles différentes. Pour garder <root> et <bar> même, et ré-écrire <baz>, essayez ceci (non testé) comme point de départ:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml"/> 

    <!-- Match <baz> and re-write a little --> 
    <xsl:template match="baz"> 
    xxx<baz id="{@id}"> 
    <xsl:apply-templates /> 
    </baz>xxx 
    </xsl:template> 

    <!-- By default, copy all elements, attributes, and text --> 
    <xsl:template match="@* | node()"> 
<xsl:copy> 
    <xsl:apply-templates select="@* | node()"/> 
</xsl:copy> 
    </xsl:template> 


</xsl:stylesheet> 
+0

Ah, je peux donc enchaîner certaines règles en les écrivant un par un. Merci beaucoup! – stofl

0

En supposant que votre fichier .xml a le même espace de noms pour poste: xmlns: ext = "www. foo.com "ce xslt produit votre sortie, bien que vous deviez le prendre avec un grain de sel, car il ne vérifie absolument rien, produit simplement votre sortie pour ce cas particulier.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ext="www.foo.com"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/root"> 
    <root> 

     <xsl:text>--</xsl:text><xsl:value-of select="./ext:foo/text()"/><xsl:text>--</xsl:text> 
     <xsl:copy-of select="./bar"/> 
     <xsl:variable name="bazElem" select="./baz"/> 
     <xsl:text>xxx</xsl:text><baz id="{$bazElem/@id}"> 
     <xsl:copy-of select="$bazElem/something"/> 
     </baz><xsl:text>xxx</xsl:text> 
    </root> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Merci pour votre réponse et votre code. J'ai oublié de mentionner que la structure du xml n'est pas déterminée. Donc je ne peux pas aller de cette façon. Désolé pour le manque de clarté. – stofl