从docx中提取表格

时间:2014-08-06 13:07:47

标签: xml xslt

我正在尝试提取给定文档中的表(以docx格式)以进一步处理unix环境中的信息。中间目标是为单独文件中的每个表提供表格格式(csv或xml)的数据。因此,我试图使用xslt生成xml格式但是失败了。我是xslt的新手,想要一些指导。我不想使用perl /其他语言,因为表格没有标准化。

我想明白,

  1. 如何识别和区分各种表?
  2. 如何根据xslt中的表标识符创建新文件?

  3. 以下是解压缩docx文件生成的xml文件。 这包含两个表。

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 wp14"><w:body><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="003404B0"><w:r><w:t>Node Selection and Pattern Matching</w:t></w:r></w:p><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="003404B0"><w:r><w:t>In XSLT stylesheets, template rules for node selection and pattern matching are applied via the select attribute of the xsl:apply-templates command and the match attribute of the xsl:template element, respectively. A specification can be created to determine how to resolve issues in the event that a multiple number of applicable template rules exist, or alternately, when there are no applicable template rules at all.</w:t></w:r></w:p><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0"/><w:tbl><w:tblPr><w:tblStyle w:val="TableGrid"/><w:tblW w:w="0" w:type="auto"/><w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/></w:tblPr><w:tblGrid><w:gridCol w:w="3116"/><w:gridCol w:w="3117"/><w:gridCol w:w="3117"/></w:tblGrid><w:tr w:rsidR="003404B0" w:rsidTr="003404B0"><w:tc><w:tcPr><w:tcW w:w="3116" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0"><w:r><w:t xml:space="preserve">Table1 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="3117" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0"><w:r><w:t>heading</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="3117" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0"><w:r><w:t>Text</w:t></w:r></w:p></w:tc></w:tr><w:tr w:rsidR="003404B0" w:rsidTr="003404B0"><w:tc><w:tcPr><w:tcW w:w="3116" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0"><w:r><w:t>body</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="3117" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0"><w:r><w:t>Blah</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="3117" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0"><w:r><w:t>blah</w:t></w:r></w:p></w:tc></w:tr><w:tr w:rsidR="003404B0" w:rsidTr="003404B0"><w:tc><w:tcPr><w:tcW w:w="3116" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0"><w:r><w:t>Body2</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="3117" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0"><w:r><w:t>Blah2</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="3117" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0"><w:r><w:t>Blah2</w:t></w:r></w:p></w:tc></w:tr></w:tbl><w:p w:rsidR="006C4C5A" w:rsidRDefault="006C4C5A"/><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="003404B0"><w:r><w:t>Node Selection</w:t></w:r></w:p><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="003404B0"><w:r><w:t>With the select attribute of xsl:apply-templates command, an XPath description can be used to either (1) select a multiple number of nodes with identical names, or (2) select a multiple number of nodes with differing names. Under scenario (1), using XPath to designate "ProductList/ Product" results in the selection of two Product element nodes.</w:t></w:r></w:p><w:tbl><w:tblPr><w:tblStyle w:val="TableGrid"/><w:tblW w:w="0" w:type="auto"/><w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/></w:tblPr><w:tblGrid><w:gridCol w:w="2383"/><w:gridCol w:w="2420"/><w:gridCol w:w="2194"/><w:gridCol w:w="2353"/></w:tblGrid><w:tr w:rsidR="003404B0" w:rsidTr="003404B0"><w:tc><w:tcPr><w:tcW w:w="2383" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="0042011C"><w:r><w:t xml:space="preserve">Table1 </w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2420" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="0042011C"><w:r><w:t>heading</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2194" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="0042011C"><w:r><w:t>Col1</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2353" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="0042011C"><w:r><w:t>Text</w:t></w:r></w:p></w:tc></w:tr><w:tr w:rsidR="003404B0" w:rsidTr="003404B0"><w:tc><w:tcPr><w:tcW w:w="2383" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="0042011C"><w:r><w:t>body</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2420" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="0042011C"><w:r><w:t>Blah</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2194" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="0042011C"><w:r><w:t>Col1 Blah</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2353" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="0042011C"><w:r><w:t>blah</w:t></w:r></w:p></w:tc></w:tr><w:tr w:rsidR="003404B0" w:rsidTr="003404B0"><w:tc><w:tcPr><w:tcW w:w="2383" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="0042011C"><w:r><w:t>Body2</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2420" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="0042011C"><w:r><w:t>Blah2</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2194" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="0042011C"><w:r><w:t>Col1 Blah2</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2353" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="0042011C"><w:r><w:t>Blah2</w:t></w:r></w:p></w:tc></w:tr><w:tr w:rsidR="003404B0" w:rsidTr="003404B0"><w:tc><w:tcPr><w:tcW w:w="2383" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="003404B0"><w:r><w:t>B</w:t></w:r><w:r><w:t>ody3</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2420" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="003404B0"><w:r><w:t>Blah3</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2194" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="003404B0"><w:r><w:t>Col1 Blah3</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2353" w:type="dxa"/></w:tcPr><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="003404B0"><w:r><w:t>Blah3</w:t></w:r><w:bookmarkStart w:id="0" w:name="_GoBack"/><w:bookmarkEnd w:id="0"/></w:p></w:tc></w:tr></w:tbl><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="003404B0"/><w:p w:rsidR="003404B0" w:rsidRDefault="003404B0" w:rsidP="003404B0"/><w:sectPr w:rsidR="003404B0"><w:pgSz w:w="12240" w:h="15840"/><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:docGrid w:linePitch="360"/></w:sectPr></w:body></w:document>
    

    我的实验:输出只是所有文本的转储,甚至占用了空格。

    xsl文件:

    <xsl:transform
            version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:dyn="http://exslt.org/dynamic"
            extension-elements-prefixes="dyn">
      <xsl:output method="xml" indent="yes"/>
      <xsl:strip-space elements="*"/>
    
      <xsl:template match="/tbl">
      </xsl:template>
        </xsl:transform>
    

1 个答案:

答案 0 :(得分:2)

现在你的问题是,没有人能够回答这个问题,因为a)你在同时问多种不同的事情,而b)不是非常具体地说明你的要求。但我会尽力帮助你解决困难。

你在问题​​中至少提到了这些问题:

  • 从OpenXML文档中查找并提取某些元素
  • 保留这些元素的身份
  • 以XML或CSV格式创建多个输出文件

查找tbl元素

首先,你必须要知道OpenXML中的所有元素(和大多数属性)(* .docx背后的格式)都是前缀,也就是说,它们位于命名空间。这有很多实际后果,但目前唯一重要的是:就您的XSLT处理器而言,tbl元素与名为w:tbl的元素完全不同。因此,如果您的模板与tbl元素匹配,则永远不会找到您实际需要的元素。

输入XML中存在且与XSLT样式表相关的任何命名空间必须在那里重新声明:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">

然后,编写一个匹配w:tbl元素的模板:

<xsl:template match="//w:tbl">
  <xsl:copy/>
</xsl:template>

换句话说,找到WordML&#34; main&#34;中的tbl个元素。命名空间。如果这是样式表中唯一的模板,则结果中将有两个tbl元素。

唯一标识元素

在XSLT中,赋予元素唯一标识的正确方法是添加ID属性。这是由一个名为generate-id()的函数完成的。以下模板只是将此功能合并到代码中的众多方法之一。

<xsl:template match="//w:tbl">
    <tbl id="{generate-id()}"/>
</xsl:template>

创建多个输出文件

如果您使用的是XSLT 1.0,则没有标准方法可以从同一样式表创建多个输出。您必须使用扩展功能。另一方面,如果您的XSLT处理器支持XSLT 2.0,则可以使用xsl:result-document元素创建多个输出文档,CSV或XML。