使用 xsltproc 合并 *.foods 以生成包含多个工作表的工作簿

Merging *.fods using xsltproc to generate worbook with multiple sheets

我在 unix 环境中有几个 excel 作品sheet。 我的目标是在 unix 环境中将它们合并到一个工作簿中。

我找到了一个使用 xsltproc 的找到的解决方案,它可以工作,但不能完全完成工作。 (merge mutliple excel files into one excel workbook but different worksheets using bash scripting)

根据上面提供的答案,这是我当前的工作流程 link :

  1. 将每个 *.xlsx sheet 转换为 *.fods 文件

soffice --headless --convert-to fods file*.xlsx

  1. 使用 xsltproc 一个接一个地合并 *.fods sheets,得到一个包含所有 sheets 的工作簿。
  2. 使用以下命令将 *.fods 工作簿转换回 *.xlsx:

soffice --headless --convert-to xslx outputfile*.fods

我卡住的地方是#2。 link 中的原始答案提供了一个基于 xsltproc 的解决方案,它可以合并两个 sheet。 我正在尝试通过以下方法逐步扩展它:

xsltproc --stringparam secondfile file2.fods tablemerge.xsl file1.fods > int_2.fods

xsltproc --stringparam secondfile file3.fods tablemerge.xsl int_2.fods > final.fods

只要 只有 2 个 sheets 被组合,它就可以完美地工作,但是当我尝试将 file3.fods 添加到中间文件 int_2.fods.

我看到的问题是 final.fods 在 file3.fods 中包含作品 sheet 的两个副本。

我怀疑 tablemerge.xsl 文件有问题,该文件的末尾包含一些 xml 语法(如下)。问题是我不知道 xml 是如何工作的,但语法似乎不是很复杂。任何建议在下面的代码中需要进行哪些修改的帮助都会非常有帮助。提前致谢。

tablemerge.xsl:

<?xml version="1.0" ?>
<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:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
  xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
  xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
  xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
  xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
  xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
  xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0"
  xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
  xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
  xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
  xmlns:math="http://www.w3.org/1998/Math/MathML"
  xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
  xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
  xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
  xmlns:ooo="http://openoffice.org/2004/office"
  xmlns:ooow="http://openoffice.org/2004/writer"
  xmlns:oooc="http://openoffice.org/2004/calc"
  xmlns:dom="http://www.w3.org/2001/xml-events"
  xmlns:xforms="http://www.w3.org/2002/xforms"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:rpt="http://openoffice.org/2005/report"
  xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2"
  xmlns:xhtml="http://www.w3.org/1999/xhtml"
  xmlns:grddl="http://www.w3.org/2003/g/data-view#"
  xmlns:tableooo="http://openoffice.org/2009/table"
  xmlns:drawooo="http://openoffice.org/2010/draw"
  xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0"
  xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"
  xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0"
  xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
  xmlns:css3t="http://www.w3.org/TR/css3-text/" 
  office:version="1.2" 
  office:mimetype="application/vnd.oasis.opendocument.spreadsheet">

  <xsl:template match="table:table">
    <!-- copy table:table from main file -->
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
    <table:table 
      table:name="{document($secondfile)//table:table/@table:name}" 
      table:style-name="{document($secondfile)//table:table/@table:style-name}">
    <!-- copy table:table from second file -->
      <xsl:copy-of select="document($secondfile)//table:table/child::*" />
    </table:table>
  </xsl:template>

   <!-- default template: identity transform -->
   <xsl:template match="/ | @* | node()">
     <xsl:copy>
       <xsl:apply-templates select="@* | node()" />
     </xsl:copy>
   </xsl:template>

</xsl:stylesheet>

编辑1

不确定如何完整描述我所看到的,但我会试一试。

我手动创建了一个包含两个sheet的工作簿,并将其保存为xlsx,然后转换为*.fods。然后我将这个新食物与单一工作生成的食物进行比较sheet。它似乎确实向我表明了我到底需要什么。

在 fods 文件中,我看到以下内容:

#1。在单个 sheet 的食物中,我只看到一个 table:table 部分:

....
  <office:spreadsheet>
   <table:calculation-settings table:case-sensitive="false" table:automatic-find-labels="false" table:use-regular-expressions="false" table:use-wildcards="true"/>
   <table:table table:name="Sheet1" table:style-name="ta1">
    ........
   </table:table>
   <table:named-expressions/>
  </office:spreadsheet>
...

#2。在来自两个 sheets 的 *.fods 中,我只看到 two table:table 部分:

....
  <office:spreadsheet>
   <table:calculation-settings table:case-sensitive="false" table:automatic-find-labels="false" table:use-regular-expressions="false" table:use-wildcards="true"/>
   <table:table table:name="Sheet1" table:style-name="ta1">
    ........
   </table:table>
   <table:table table:name="Sheet2" table:style-name="ta2">
    .......
   </table:table>
   <table:named-expressions/>
  </office:spreadsheet>
...

我想我正在寻找的是 tablemerge.xsl ,它可以帮助我合并两个 *.fods,如 #1 中所示,并得到类似于*.fods 在#2。 当然,复杂的是输入的 *.fods 中的一个可以包含多个 sheets,最终输出 *.fods 应该只是将第二个文件的 table:table 部分连接到第一个 *.fods。

这主要是猜测,因为我们不知道 .fods 文件的确切规范 - 而且您甚至没有向我们展示完整的示例。也许试试:

XSLT 1.0

<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">

<xsl:param name="secondfile"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="office:spreadsheet">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:copy-of select="document($secondfile)//table:table" />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

这可能有效也可能无效,这取决于 office:spreadsheet 的其他子元素(即 table:calculation-settingstable:named-expressions)在其中扮演的角色,以及我认为的其他因素我无法预测。

我什至不确定如何可靠地测试结果“有效”;您可能会从其他文件中获取工作表,但它们可能缺少某些功能。