web-dev-qa-db-fra.com

Ajout d'un élément au milieu de xml à l'aide de xslt

Voici le xml réel:

<?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-il possible d'ajouter un élément XML entre deux à l'aide de xslt? Veuillez me donner un échantillon!

26
Madhu CM

Voici une feuille de style XSLT 1.0 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>

Évidemment, la logique variera selon d'où vous obtiendrez les nouvelles données et où elles doivent aller. La feuille de style ci-dessus insère simplement un <Age> élément après chaque <Name> élément, et un <Domain> élément après chaque <Dept> élément.

(Limitation: si votre document peut avoir <Name> ou <Dept> éléments dans d'autres <Name> ou <Dept> éléments, seuls les plus externes auront ce traitement spécial. Je ne pense pas que vous souhaitiez que votre document ait ce type de structure récursive, donc cela ne vous affecterait pas, mais cela vaut la peine de le mentionner au cas où.)

37
LarsH

J'ai modifié peu de choses dans la feuille de style existante, cela vous permettra de choisir l'élément spécifique et de le mettre à jour dans votre 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>
4
sathya