我正在尝试将CSV(逗号分隔文件)转换为XML。为此,我正在编写一个XSLT模板,这是我在XSLT上的第一次尝试...
CSV示例:
ClaimRef,HandlerRef,ClaimType,Date,Area,SettleDate,ClaimStatus,ClaimantName
1,1/1,Liability,08-12-2013,US,23-05-2014,Closed,Mark
2,1/2,Liability,08-10-2013,UK,23-02-2014,Closed,John
所需的XML输出格式:
<Claims>
<Claim>
<ClaimRef></ClaimRef>
<HandlerRef></HandlerRef>
<ClaimType></ClaimType>
<Date></Date>
<Area></Area>
<SettleDate></SettleDate>
<ClaimStatus></ClaimStatus>
<ClaimantName></ClaimantName>
</Claim>
</Claims>
我使用http://blogs.msdn.com/b/kaevans/archive/2003/04/17/5780.aspx作为初始开始,使用http://xslttest.appspot.com/来测试结果。但是本文提到了如何将值设为<row><elem>, etc
。
请您指导我如何编写XSLT代码以根据示例CSV数据生成上述XML。
答案 0 :(得分:5)
这是一个XSLT 2.0选项...
CSV输入(csv-uri
参数中引用的so.csv。)
ClaimRef,HandlerRef,ClaimType,Date,Area,SettleDate,ClaimStatus,ClaimantName
1,1/1,Liability,08-12-2013,US,23-05-2014,Closed,Mark
2,1/2,Liability,08-10-2013,UK,23-02-2014,Closed,John
XSLT 2.0 (使用格式正确的XML XML文档或样式表本身作为输入,或指定csv2xml
作为初始模板。)
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="csv-encoding" as="xs:string" select="'iso-8859-1'"/>
<xsl:param name="csv-uri" as="xs:string" select="'file:///C:/Users/dhaley/Desktop/so.csv'"/>
<xsl:template match="/" name="csv2xml">
<Claims>
<xsl:choose>
<xsl:when test="unparsed-text-available($csv-uri, $csv-encoding)">
<xsl:variable name="csv" select="unparsed-text($csv-uri, $csv-encoding)"/>
<!--Get Header-->
<xsl:variable name="header-tokens" as="xs:string*">
<xsl:analyze-string select="$csv" regex="\r\n?|\n">
<xsl:non-matching-substring>
<xsl:if test="position()=1">
<xsl:copy-of select="tokenize(.,',')"/>
</xsl:if>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:variable>
<xsl:analyze-string select="$csv" regex="\r\n?|\n">
<xsl:non-matching-substring>
<xsl:if test="not(position()=1)">
<Claim>
<xsl:for-each select="tokenize(.,',')">
<xsl:variable name="pos" select="position()"/>
<xsl:element name="{$header-tokens[$pos]}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</Claim>
</xsl:if>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="error">
<xsl:text>Error reading "</xsl:text>
<xsl:value-of select="$csv-uri"/>
<xsl:text>" (encoding "</xsl:text>
<xsl:value-of select="$csv-encoding"/>
<xsl:text>").</xsl:text>
</xsl:variable>
<xsl:message><xsl:value-of select="$error"/></xsl:message>
<xsl:value-of select="$error"/>
</xsl:otherwise>
</xsl:choose>
</Claims>
</xsl:template>
</xsl:stylesheet>
XML输出
<Claims>
<Claim>
<ClaimRef>1</ClaimRef>
<HandlerRef>1/1</HandlerRef>
<ClaimType>Liability</ClaimType>
<Date>08-12-2013</Date>
<Area>US</Area>
<SettleDate>23-05-2014</SettleDate>
<ClaimStatus>Closed</ClaimStatus>
<ClaimantName>Mark</ClaimantName>
</Claim>
<Claim>
<ClaimRef>2</ClaimRef>
<HandlerRef>1/2</HandlerRef>
<ClaimType>Liability</ClaimType>
<Date>08-10-2013</Date>
<Area>UK</Area>
<SettleDate>23-02-2014</SettleDate>
<ClaimStatus>Closed</ClaimStatus>
<ClaimantName>John</ClaimantName>
</Claim>
</Claims>
每条评论更新......
以下是相同的示例,但使用的是变量而不是外部CSV文件。您可以使用此XSLT在支持XSLT 2.0的其他在线测试工具中进行测试。