2010-07-12 5 views
0

Comment encapsuler des nœuds autour de mes blocs XML en utilisant XSLT? Par exemple, j'ai le fichier XML suivant.XSLT: Ajout d'un noeud!

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" /> 

    <xsl:template match="/"> 
    <Root> 
     <VOBaseCollection> 
     <xsl:apply-templates select="Root/Location" /> 
     </VOBaseCollection> 
    </Root> 
    </xsl:template> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Mon fichier XML d'entrée ressemble à ceci.

<Root> 
<Location><Name>Pennsylvania</Name><Type>State</Type></Location> 
</Root> 

Je souhaite que la sortie ressemble à ceci.

 <Root><Container> 
    <Location><Name>Pennsylvania</Name><Type>State</Type></Location> 
</Container> 
    </Root> 

Je tiens à vous assurer qu'un noeud appelé <CONTAINER> soit appliquée à chaque fois, il copie sur l'information de Root/Lieu. Quels changements dois-je faire pour mon fichier XSLT?

+0

Il est pas clair ce que vous essayez de faire. Que diriez-vous de fournir un petit exemple de fichier XML et la sortie que vous espérez obtenir? – Welbog

+0

Mon fichier XML ressemble à ceci. [code] Pennsylvania État [/ code] Je souhaite transformer ce fichier en [code] Pennsylvania État [/ code] – abhi

+1

alors quel est '' dans votre exemple? Si vous renommez cela en '', il semblerait que vous ayez exactement ce que vous voulez. – Welbog

Répondre

1

Résumer un outes les réponses dans les commentaires, ce:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()" name="identity"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Location"> 
     <Container> 
      <xsl:call-template name="identity"/> 
     </Container> 
    </xsl:template> 
</xsl:stylesheet> 

Résultat:

<Root> 
    <Container> 
     <Location> 
      <Name>Pennsylvania</Name> 
      <Type>State</Type> 
     </Location> 
    </Container> 
</Root> 
+0

Cela a partiellement résolu le problème. Merci. Alejandro. – abhi

1

Je devine juste, et en mode estimation il semble que vous voulez que ce:

EDIT: aidé par une autre estimation par Mads Hansen ...

Ajouter cette au modèle d'identité que vous avez déjà:

<xsl:template match="Location"> 
    <CONTAINER><xsl:apply-templates/></CONTAINER> 
</xsl:template> 
+0

Il n'y a pas de CONTENEUR dans mon document XML, alors où fera-t-il l'appariement? – abhi

+0

@abhi: Vous n'avez pas montré de document XML et * ceci * est le vrai problème ... Quand vous dites: "Je souhaite m'assurer qu'un noeud appelé' 'est appliqué à chaque fois" - Je comprends que il y a un '' dans le document XML et vous souhaitez que chaque fois qu'il est apparié (un modèle lui est appliqué), alors un certain traitement (copie de 'Root/Location') doit être fait. S'il vous plaît, éditez votre question et mieux la définir. En outre, fournissez un document XML minimal! –

+0

@Dimitre - Il veut faire correspondre le 'location' et enveloppez avec' Container': ' \t \t \t ' –

Questions connexes