2010-09-06 4 views
20

Ci-dessous le xml réelle:Ajout élément au milieu de XML à l'aide xslt

<?xml version="1.0" encoding="utf-8"?> 
<employee> 
<Name>ABC</Name> 
<Dept>CS</Dept> 
<Designation>sse</Designation> 
</employee> 

Et je veux la sortie comme ci-dessous:

<?xml version="1.0" encoding="utf-8"?> 
<employee> 
<Name>ABC</Name> 
    <Age>34</Age> 
<Dept>CS</Dept> 
    <Domain>Insurance</Domain> 
<Designation>sse</Designation> 
</employee> 

Est-ce possible d'ajouter l'élément XML entre l'utilisation xslt ? S'il vous plaît me donner un échantillon!

Répondre

32

Voici un XSLT 1.0 stylesheet qui fera ce que vous avez demandé:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <!-- Identity transform --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Name"> 
     <xsl:copy-of select="."/> 
     <Age>34</Age> 
    </xsl:template> 

    <xsl:template match="Dept"> 
     <xsl:copy-of select="."/> 
     <Domain>Insurance</Domain> 
    </xsl:template> 
</xsl:stylesheet> 

Il est évident que la logique variera selon l'endroit où vous allez obtenir les nouvelles données, et où il doit aller. La feuille de style ci-dessus insère simplement un élément <Age> après chaque élément <Name> et un élément <Domain> après chaque élément <Dept>.

(Limitation. Si votre document pourrait avoir <Name> ou <Dept> éléments dans d'autres <Name> ou <Dept> éléments, seuls les plus à l'extérieur auront ce traitement spécial que je ne pense pas que vous avez l'intention de votre document pour avoir ce genre de structure récursive Cela ne vous affectera pas, mais cela vaut la peine de le mentionner au cas où.

+0

si vous ne souhaitez que l'élément à ajouter une fois, au lieu d'une fois pour tous les éléments Nom/Dept? – Joe

+1

@Joe: Wow, presque 5 ans plus tard. :-) Dans ce cas, vous ajoutez l'élément résultat dans un modèle qui ne correspondra qu'une seule fois. Par exemple. 'match ="/*/Nom [1] "'. – LarsH

+1

Excellent, je ne m'attendais pas vraiment à une réponse 5 ans plus tard, beaucoup moins encore si rapide! Cela aide beaucoup – Joe

2

J'ai modifié quelques éléments dans la feuille de style existante, cela vous permettra de choisir l'élément spécifique et de le mettre à jour dans votre fichier XML.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <!-- Identity transform --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Name[1]"> 
     <xsl:copy-of select="."/> 
     <Age>34</Age> 
    </xsl:template> 

    <xsl:template match="Dept[1]"> 
     <xsl:copy-of select="."/> 
     <Domain>Insurance</Domain> 
    </xsl:template> 
</xsl:stylesheet> 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<employee> 
<Name>ABC</Name> 
<Dept>CS</Dept> 
<Designation>sse</Designation> 
<Name>CDE</Name> 
<Dept>CSE</Dept> 
<Designation>sses</Designation> 
</employee>