2017-10-09 11 views
1

Supposons que vous voulez transformer ce XMLTransformer un XML dont les éléments ont plusieurs attributs et utiliser un attribut pour créer de nouveaux éléments

<?xml version="1.0" encoding="UTF-8"?> 
<package id="album"> 
    <concept id="tracknumber" value="18"></concept> 
    <concept id="songtitle" value="Multi Love"></concept> 
    <concept id="band" value="Unknown Mortal Orchestra"></concept> 
</package> 

dans ce XML:

<package> 
    <tracknumber>18</tracknumber> 
    <songtitle>Multi Love</songtitle> 
    <band>Unknown Mortal Orchestra</band> 
</package> 

Ceci est le XSLT point de départ pour transformer le code source XML:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
     <xsl:template match="package[@id='album']"> 
      <package> 
       <tracknumber> 
        <xsl:value-of select="concept[@id='tracknumber']" /> 
       </tracknumber> 
       <songtitle> 
        <xsl:value-of select="concept[@id='songtitle']" /> 
       </songtitle> 
       <band> 
        <xsl:value-of select="concept[@id='band']" /> 
       </band> 
      </package> 

     </xsl:template> 
    </xsl:stylesheet> 

Il semble difficile d'obtenir la partie "valeur" du XML ttributes.

Répondre

1

envisager une solution XSLT dynamique sans critère de valeur explicite dans XML cas contient beaucoup <concept> tags:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:template match="package[@id='album']"> 
     <xsl:copy> 
      <xsl:apply-templates select="concept" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="concept">    
     <xsl:element name="{@id}"> 
      <xsl:value-of select="@value" /> 
     </xsl:element>    
    </xsl:template> 
</xsl:stylesheet> 
+0

C'est une bonne réponse! J'ai simplifié cet exemple pour le rendre plus facile à comprendre. Dans la réalité, le résultat est un peu plus délicat, avec des éléments complexes qui ne suivent aucune logique spécifique autre que les besoins du client. – noitib

+0

Génial! Je pensais que c'était simplifié. Heureux de vous aider. – Parfait

0

Ce serait le XSLT à utiliser:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
<xsl:template match="package[@id='album']"> 
    <package> 
     <tracknumber> 
      <xsl:value-of select="concept[@id='tracknumber']/@value /> 
     </tracknumber> 
     <songtitle> 
      <xsl:value-of select="concept[@id='songtitle']/@value" /> 
     </songtitle> 
     <band> 
      <xsl:value-of select="concept[@id='band']/@value" /> 
     </band> 
    </package> 

    </xsl:template> 
</xsl:stylesheet>