我有这个xslt将csv转换为xml,工作正常,但所有列的标签都相同.
我需要它像这样增加
我需要它像这样增加
<row> <column1></column1> <column2></column2> <column3></column3> </row>
当我使用position()时,它将所有列重命名为column1
<xsl:element name="{concat('column',position())}">
这是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="'
'"/> <!-- 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 line@R_502_349@--> <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 line@R_502_349@--> <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>
这是一个示例csv:
<root> 3779490,916705,CS,60,34.89,Sauce/Cholula 5918104,918958,6,20.63,Pasta/Fresh/Cavatelli/6#/Frozen 5064774,920723,10,45.5,Cheese/Oaxaca 3422752,925230,EA,8,69.6,Chipotle/Powder/Ground 5955640,BB171,30,50.7,Butter/Unsalted 5295326,BC110005,6000,54.95,Oil/Olive/Finishing </root>
看起来csvtoxml被一个大字符串调用,它递归地通过该字符串. position()在这种情况下不起作用,因为你没有使用一组节点.
相反,你可以用计数参数来实现你所追求的目标:
<xsl:template name="csvtoxml"> <!-- import $StringToTransform--> <xsl:param name="StringToTransform" select="''"/> <xsl:param name="ColumnNum" select="1"/> <xsl:choose> <!-- string contains line@R_502_349@--> <xsl:when test="contains($StringToTransform,')"> <!-- Get everything up to the first carriage return--> <xsl:element name="{concat('column',$ColumnNum)}"> <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" select="substring-after($StringToTransform,')" /> <xsl:with-param name="ColumnNum" select="$ColumnNum + 1" /> </xsl:call-template> </xsl:when> <!-- string does not contain newline,so just output it--> <xsl:otherwise> <xsl:element name="{concat('column',$ColumnNum)}"> <xsl:value-of select="$StringToTransform" /> </xsl:element> </xsl:otherwise> </xsl:choose> </xsl:template>