2017-10-02 12 views
0

Je suis Tring d'exporter des attributs XML au format CSV en utilisant xsl mais je suis confronté à ce problème:xml Export attribue à csv en utilisant xsl

<root> 
    <tag id="1"> 
    <itemA id="930" dummyAttr1="bla" dummyAttr2="bla bla" dummyAttr3="bla bla bla" /> 
    <itemA id="931" dummyAttr1="bla" dummyAttr3="bla bla bla" /> 
    <itemA id="932" dummyAttr2="bla bla" dummyAttr3="bla bla bla" /> 
    <itemA id="933" dummyAttr4="another bla" dummyAttr3="bla bla bla" /> 
    </tag> 
    <tag id="2"> 
    <itemA id="940" dummyAttr1="lorem" dummyAttr2="ipsum" /> 
    <itemA id="941" dummyAttr1="dolor" dummyAttr3="sit" /> 
    <itemA id="942" dummyAttr3="amet" /> 
    </tag> 
</root> 

J'ai des attributs dynamiques que je veux mettre dans un en-tête de csv puis je vouloir ajouter mes valeurs d'attribut sous l'en-tête de droite.

J'ai essayé quelque chose comme ça sans succès

<?xml version="1.0"?> 
    <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://saxon.sf.net/" 
    exclude-result-prefixes="#all"> 
     <xsl:output method="text" omit-xml-declaration="yes" indent="no"/> 
     <xsl:template name="header" > 
      <xsl:for-each-group select="//itemA/@*" group-by="name(.)"> 
       <xsl:value-of select="name(.)"/> 
       <xsl:choose> 
        <xsl:when test="position() != last()"> 
         <xsl:text>,</xsl:text> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:text>&#xA;</xsl:text> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each-group> 
     </xsl:template> 
     <xsl:template name="values" > 
      <xsl:for-each-group select="//itemA/@*" group-by="name(.)"> 
       <xsl:value-of select="."/> 
       <xsl:choose> 
        <xsl:when test="position() != last()"> 
         <xsl:text>,</xsl:text> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:text>&#xA;</xsl:text> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each-group> 
     </xsl:template> 
     <xsl:template match="/"> 
      <xsl:call-template name="header"/> 
      <xsl:for-each select="//itemA"> 
       <xsl:for-each select="./@*"> 
        <xsl:variable name="test"> 
         <xsl:call-template name="values"/> 
        </xsl:variable> 
        <xsl:value-of select="$test"/> 
       </xsl:for-each> 
       <xsl:text>&#xA;</xsl:text> 
      </xsl:for-each> 
     </xsl:template> 
    </xsl:stylesheet> 

La sortie doit ressembler à ceci:

id,dummyAttr1,dummyAttr2,dummyAttr3,dummyAttr4 
930,bla,bla bla,bla bla bla, 
931,bla,,bla bla bla, 
932,,bla bla,bla bla bla, 
933,,,bla bla bla,another bla 
940,lorem,ipsum,, 
941,dolor,,sit, 
942,,,amet, 

Merci

Répondre

0

Je pense que ce qui suit devrait faire:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math" 
    version="3.0"> 

    <xsl:output method="text"/> 

    <xsl:variable name="columns" as="xs:string*" select="distinct-values(//itemA/@*/name())"/> 

    <xsl:template match="/"> 
     <xsl:value-of select="$columns" separator=","/> 
     <xsl:text>&#10;</xsl:text> 
     <xsl:apply-templates select="//itemA"/> 
    </xsl:template> 

    <xsl:template match="itemA"> 
     <xsl:value-of select="for $col in $columns return (@*[name() = $col], '')[1]" separator=","/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

ou peut-être pour ce dernier modèle

<xsl:template match="itemA"> 
    <xsl:value-of select="for $col in $columns return @*[name() = $col] || ''" separator=","/> 
    <xsl:text>&#10;</xsl:text> 
</xsl:template> 
+0

Merci pour la réponse, ça semble aller;) –