0

我正在从 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>
4

1 回答 1

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-publicanddoctype-system属性为 XHTML 创建正确的文档类型声明。
  • 剩下的就是翻译<Row>to<tr><Cell>to <td>,这很容易使用两个简单的模板。
  • 您可以编写其他更专业的模板,例如<xsl:template match="Data[@ss:Type='Number']">以不同格式输出某些数据类型。
于 2012-12-07T15:48:17.750 回答