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

时间:2016-09-20 10:15:52

标签: xml xslt openoffice.org openoffice-calc

我正在使用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(有点长)

1 个答案:

答案 0 :(得分: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>