在 XSLT 导出过滤器中为 OpenOffice Calc 指定工作表

Posted

技术标签:

【中文标题】在 XSLT 导出过滤器中为 OpenOffice Calc 指定工作表【英文标题】:Specify worksheet in XSLT export filter for OpenOffice Calc 【发布时间】:2016-09-20 10:15:52 【问题描述】:

我正在使用 XSLT 导出过滤器将我的 OpenOffice Calc 文件的一部分提取到 XML 文件中。我的过滤器基于this SO question 中的第二个答案,它工作正常,直到我将另一个工作表添加到 Calc 文件中。

现在过滤器应用于每个工作表,因为它们完全不同,所以生成的 XML 是垃圾。

我可以指定导出时将过滤器应用到哪个工作表吗?喜欢使用工作表的名称或订单位置?

编辑:

Excel 看起来 like this。

如您所见,还有第二个工作表,我想应用另一个 XSLT 过滤器。

目前屏幕截图中表格的过滤器看起来像这样(当只有一个电子表格时它可以正常工作):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" exclude-result-prefixes="office table text">

 <xsl:template match="/">
  <command name="CreateTitle">
   <xsl:apply-templates select="/*/office:body" />
  </command>
 </xsl:template>

 <xsl:template match="office:body">
  <xsl:apply-templates />
 </xsl:template>

 <xsl:template match="office:spreadsheet">
  <xsl:apply-templates />
 </xsl:template>

 <xsl:template match="office:spreadsheet/table:table">
    <title><xsl:value-of select="table:table-row[2]/table:table-cell[1]/text:p" /></title> 
    <titleDesc><xsl:value-of select="table:table-row[2]/table:table-cell[2]/text:p" /></titleDesc>
    <institute><xsl:value-of select="table:table-row[2]/table:table-cell[3]/text:p" /></institute>   
    <contractType><xsl:value-of select="table:table-row[2]/table:table-cell[4]/text:p" /></contractType>
 </xsl:template>
</xsl:stylesheet>

这是输入格式:http://pastebin.com/tLyFKU4e(有点长)

【问题讨论】:

尝试将&lt;xsl:template match="office:body"&gt;&lt;xsl:apply-templates /&gt;&lt;/xsl:template&gt; 更改为&lt;xsl:template match="office:body"&gt;&lt;xsl:apply-templates select="office:spreadsheet[1]"/&gt;&lt;/xsl:template&gt; 以尝试根据位置进行处理。我对 OpenOffice 的 XML 格式不熟悉,请自行尝试。 感谢您的建议,但遗憾的是没有奏效。我也尝试用谷歌搜索这种语法,但找不到任何东西。 &lt;xsl:apply-templates select="office:spreadsheet[1]"/&gt; 更改为&lt;xsl:apply-templates select="descendant::office:spreadsheet[1]"/&gt; 会改善情况吗?正如我所说,我不熟悉确切的 XML 格式,因此除非您编辑问题并向我们展示它猜测的输入示例。 遗憾的是这也没有帮助(生成的 XML 为空)。我编辑了更多信息,希望对您有所帮助。 尝试写一个简单的样式表只做&lt;xsl:template match="/"&gt;&lt;xsl:copy-of select="."/&gt;&lt;/xsl:template&gt;,然后你应该看到输入格式,你可以发布它 【参考方案1】:

似乎spreadsheet 元素包含各种table 子元素,因此如果您只想处理第一个表(假设它代表第一个工作表),请使用

<xsl:template match="office:body">
  <xsl:apply-templates select="office:spreadsheet/table:table[1]"/>
</xsl:template>

与您的其他模板一起设置根元素,当然还有从表中提取数据的模板

 <xsl:template match="/">
  <command name="CreateTitle">
   <xsl:apply-templates select="/*/office:body" />
  </command>
 </xsl:template>

 <xsl:template match="office:spreadsheet/table:table">
    <title><xsl:value-of select="table:table-row[2]/table:table-cell[1]/text:p" /></title> 
    <titleDesc><xsl:value-of select="table:table-row[2]/table:table-cell[2]/text:p" /></titleDesc>
    <institute><xsl:value-of select="table:table-row[2]/table:table-cell[3]/text:p" /></institute>   
    <contractType><xsl:value-of select="table:table-row[2]/table:table-cell[4]/text:p" /></contractType>
 </xsl:template>

【讨论】:

以上是关于在 XSLT 导出过滤器中为 OpenOffice Calc 指定工作表的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 导出过滤器产生不必要的空 XML 标记

在 OpenOffice Calc 中过滤

我可以使用 XSLT 将 OpenOffice ODT 内容 (content.xml) 转换为 HTML 吗?

如何在 OpenOffice.org 中为文本编写内联样式

将 mySQL 表导出到 OpenOffice 电子表格

如何使用 Apache Camel 在 XSLT 中为每个组申请