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