CSV en XML en utilisant xslt - comment avoir incrémentation nom de la colonne

J'ai cette xslt pour convertir un fichier csv en xml, fonctionne très bien, sauf que la balise est la même pour toutes les colonnes.
J'en ai besoin pour incrémenter comme ce

<row>
  <column1></column1>
  <column2></column2>
  <column3></column3>
</row>

lorsque j'utilise la position() il renomme toutes les colonnes à colonne1

<xsl:element name="{concat('column', position())}">

Ici est le xslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:variable name="LF" select="'&#xA;'"/>
<!-- template that matches the root node-->
<xsl:template match="/">
<root>
<xsl:call-template name="texttorows">
<xsl:with-param name="StringToTransform" select="/root"/>
</xsl:call-template>
</root>
</xsl:template>
<!-- template that actually does the conversion-->
<xsl:template name="texttorows">
<!-- import $StringToTransform-->
<xsl:param name="StringToTransform" select="''"/>
<xsl:choose>
<!-- string contains linefeed-->
<xsl:when test="contains($StringToTransform,$LF)">
<!-- Get everything up to the first carriage return-->
<row>
<xsl:call-template name="csvtoxml">
<xsl:with-param name="StringToTransform" select="substring-before($StringToTransform,$LF)"/>
</xsl:call-template>
</row>
<!-- repeat for the remainder of the original string-->
<xsl:call-template name="texttorows">
<xsl:with-param name="StringToTransform">
<xsl:value-of select="substring-after($StringToTransform,$LF)"/>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<!-- string does not contain newline, so just output it-->
<xsl:otherwise>
<row>
<xsl:call-template name="csvtoxml">
<xsl:with-param name="StringToTransform" select="$StringToTransform"/>
</xsl:call-template>
</row>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="csvtoxml">
<!-- import $StringToTransform-->
<xsl:param name="StringToTransform" select="''"/>
<xsl:choose>
<!-- string contains linefeed-->
<xsl:when test="contains($StringToTransform,',')">
<!-- Get everything up to the first carriage return-->
<xsl:element name="{concat('column', position())}">
<xsl:value-of select="substring-before($StringToTransform,',')"/>
</xsl:element>
<!-- repeat for the remainder of the original string-->
<xsl:call-template name="csvtoxml">
<xsl:with-param name="StringToTransform">
<xsl:value-of select="substring-after($StringToTransform,',')"/>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<!-- string does not contain newline, so just output it-->
<xsl:otherwise>
<column>
<xsl:value-of select="$StringToTransform"/>
</column>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

Voici un exemple de fichier csv.

<root>
3779490,916705,CS,60,34.89,Sauce/Cholula
5918104,918958,CS,6,20.63,Pasta/Fresh/Cavatelli/6#/Frozen
5064774,920723,CS,10,45.5,Cheese/Oaxaca
3422752,925230,EA,8,69.6,Chipotle/Powder/Ground
5955640,BB171,CS,30,50.7,Butter/Unsalted
5295326,BC110005,CS,6000,54.95,Oil/Olive/Finishing
</root>
+1: un bien exprimée question. Cependant: essayer de lire un code pour faire défiler horizontalement et verticalement, c'est difficile. Suggérer de réduire le retrait et la rupture des lignes plus tôt (vérifiez l'aperçu). Ne cherche pas à être difficile, mais pour vous aider à obtenir de l'aide.
Concernant votre question principale, position() ne retourne pas à la position de l'élément de sortie dans son parent. Plutôt elle retourne la position du nœud de contexte dans le contexte de la séquence (qui dépend du contexte, naturellement). Généralement c'est la position du nœud de contexte parmi ses frères et sœurs dans le document d'entrée (voir la section w3.org/TR/xpath/#function-position)
Je suis d'accord. Je devrais avoir utilisé un petit tiret. J'ai juste copié à partir de visual studio.
On dirait que vous êtes à l'aide de XSLT 1.0 . Il est utile de marquer votre XSLT questions avec la de XSLT 1.0 tag ou le XSLT 2.0 tag. Bien que cela ne répond pas à votre question, cette bibliothèque de feuille de style peut être utile pour vous, si vous décidez de mettre à niveau pour XSLT 2.0: pascaliburnus.seanbdurkin.id.ua/index.php?/archives/... .

OriginalL'auteur gangt | 2012-08-17