从节点XML,XSLT创建表

时间:2012-12-07 14:36:38

标签: xml xslt xmltable

我从XML文件中获取数据并使用XSLT对其进行转换。我有一个节点,我想从中创建一个表。

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="file" select="document('file.xml')"/>

<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
    </head>
    <body>
        <table>
           <xsl:value-of select="$file/Workbook/Worksheet/Table"/>
        </table>
    </body>
</html>

//output: id firstname lastname 8 Jonas Berg 15 Adam Jones ...

我希望桌子看起来像:

id    firstname    lastname
8     Jonas        Berg  
...

我能这样做吗?

表中的XML示例:

 <Row>
<Cell ss:Index="2"><Data ss:Type="String">id</Data></Cell>
<Cell ss:StyleID="s62"><Data ss:Type="String">firstname</Data></Cell>
<Cell><Data ss:Type="String">lastname</Data></Cell>
 </Row>
   <Row>
    <Cell ss:Index="2"><Data ss:Type="Number">8</Data></Cell>
    <Cell ss:StyleID="s62"><Data ss:Type="String">Jonas</Data></Cell>
    <Cell><Data ss:Type="String">Berg</Data></Cell>
   </Row>

1 个答案:

答案 0 :(得分:1)

这很简单。唯一的挑战是使XML命名空间正确。

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns="http://www.w3.org/1999/xhtml"
>
  <xsl:output 
    type="xml"
    doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
  />

  <xml:strip-space elements="*" />

  <xsl:template match="/">
    <head>
      <title></title>
    </head>
    <body>
      <table>
        <xsl:apply-templates />
      </table>
    </body>
  </xsl:template>

  <xsl:template match="Row">
    <tr><xsl:apply-templates /></tr>
  </xsl:template>

  <xsl:template match="Cell">
    <td><xsl:apply-templates /></td>
  </xsl:template>

  <xsl:template match="Data">
    <xsl:value-of select="." />
  </xsl:template>

</xsl:stylesheet>

注释

  • 必须将XHTML命名空间声明为XSLT中的默认命名空间,否则结果文档将不是XHTML。
  • 必须声明Excel的电子表格命名空间 - 我使用了Excel使用的相同前缀 - ss
  • doctype-publicdoctype-system属性为XHTML创建了正确的doctype声明。
  • 其余的问题是将<Row>转换为<tr><Cell>转换为<td>,这可以通过两个简单的模板轻松完成。
  • 您可以编写其他更专业的模板,例如<xsl:template match="Data[@ss:Type='Number']">,以不同的格式输出某些数据类型。