我有一个包含数千行的csv。我想使用XSLT2.0将其更改为html格式。有没有办法使用xslt进行此转换?如果可能,请提供适用于任何csv到html转换的任何通用解决方案。
答案 0 :(得分:1)
这是基于此处的CSV到XML转换:http://andrewjwelch.com/code/xslt/csv/csv-to-xml_v2.html
此转换假设您的CSV中有标题行。
您需要将pathToCSV
设置为CSV文件的位置。根据CSV文件中使用的行结尾类型设置lineEnding
- 可能是Windows上的CrLf('
'
)和Linux上的Lf('
'
)。
有一些如何在链接页面上调用转换的示例,但是对于Windows命令行上的Saxon:
Transform.exe -o:c:/dev/test.html -it:main c:/dev/test.xslt pathToCSV=file:/c:/dev/test.csv
对于上面的命令行,以下是test.xslt的内容:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="fn"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="2.0" exclude-result-prefixes="xs fn">
<xsl:output method="html"
doctype-system="http://www.w3.org/TR/html4/strict.dtd"
doctype-public="-//W3C//DTD HTML 4.01//EN"
indent="yes" />
<xsl:param name="pathToCSV" select="'file:///c:/csv.csv'" />
<xsl:param name="lineEnding" select="'
'"/>
<xsl:function name="fn:getTokens" as="xs:string+">
<xsl:param name="str" as="xs:string" />
<xsl:analyze-string select="concat($str, ',')" regex='(("[^"]*")+|[^,]*),'>
<xsl:matching-substring>
<xsl:sequence select='replace(regex-group(1), "^""|""$|("")""", "$1")' />
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:function>
<xsl:template match="/" name="main">
<xsl:choose>
<xsl:when test="unparsed-text-available($pathToCSV)">
<xsl:variable name="csv" select="unparsed-text($pathToCSV)" />
<xsl:variable name="lines" select="tokenize($csv, $lineEnding)" as="xs:string+" />
<xsl:variable name="elemNames" select="fn:getTokens($lines[1])" as="xs:string+" />
<html>
<body>
<table>
<thead>
<tr>
<xsl:for-each select="$elemNames">
<th>
<xsl:value-of select="."/>
</th>
</xsl:for-each>
</tr>
</thead>
<tbody>
<xsl:for-each select="$lines[position() > 1]">
<xsl:variable name="lineItems" select="fn:getTokens(.)" as="xs:string+" />
<tr>
<xsl:for-each select="$lineItems">
<td>
<xsl:value-of select="."/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</tbody>
</table>
</body>
</html>
</xsl:when>
<xsl:otherwise>
<xsl:text>Cannot locate : </xsl:text>
<xsl:value-of select="$pathToCSV" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
对于以下CSV:
col1,col2,col3
val1,val2,val3
1,2,3
a,b,c
你得到这个HTML:
<!DOCTYPE html
PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<body>
<table>
<thead>
<tr>
<th>col1</th>
<th>col2</th>
<th>col3</th>
</tr>
</thead>
<tbody>
<tr>
<td>val1</td>
<td>val2</td>
<td>val3</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
</tr>
</tbody>
</table>
</body>
</html>