使用XSLT 2.0进行Csv到Html的转换

时间:2015-09-08 06:20:22

标签: xslt xslt-2.0

我有一个包含数千行的csv。我想使用XSLT2.0将其更改为html格式。有没有办法使用xslt进行此转换?如果可能,请提供适用于任何csv到html转换的任何通用解决方案。

1 个答案:

答案 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="'&#xD;&#xA;'"/>

   <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() &gt; 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>