通过HTML进行Word DOCX表转换

时间:2017-04-21 09:14:44

标签: xml xslt

我想转换一个docx文档中的表,但我不知道如何以相同的方式将元素放在表中。我共享XML代码的一部分:

<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="950"/>
            <w:gridCol w:w="1631"/>
            <w:gridCol w:w="963"/>
            <w:gridCol w:w="736"/>
            <w:gridCol w:w="950"/>
            <w:gridCol w:w="924"/>
            <w:gridCol w:w="883"/>
            <w:gridCol w:w="1685"/>
        </w:tblGrid>
        <w:tr w:rsidR="00090366" w:rsidRPr="001509B0" w:rsidTr="006623B3">
            <w:tc>
                <w:tcPr>
                    <w:tcW w:w="0" w:type="auto"/>
                </w:tcPr>
                <w:p w:rsidR="00090366" w:rsidRPr="001509B0" w:rsidRDefault="00090366" w:rsidP="0031172A">
                    <w:pPr>
                        <w:spacing w:line="360" w:lineRule="auto"/>
                        <w:rPr>
                            <w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
                            <w:sz w:val="24"/>
                            <w:szCs w:val="24"/>
                        </w:rPr>
                    </w:pPr>
                </w:p>
            </w:tc>
            <w:tc>
                <w:tcPr>
                    <w:tcW w:w="0" w:type="auto"/>
                </w:tcPr>
                <w:p w:rsidR="00090366" w:rsidRPr="001509B0" w:rsidRDefault="00090366" w:rsidP="0031172A">
                    <w:pPr>
                        <w:spacing w:line="360" w:lineRule="auto"/>
                        <w:rPr>
                            <w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
                            <w:sz w:val="24"/>
                            <w:szCs w:val="24"/>
                        </w:rPr>
                    </w:pPr>
                </w:p>
            </w:tc>
            <w:tc>
                <w:tcPr>
                    <w:tcW w:w="0" w:type="auto"/>
                    <w:gridSpan w:val="6"/>
                </w:tcPr>
                <w:p w:rsidR="00090366" w:rsidRPr="001509B0" w:rsidRDefault="00090366" w:rsidP="00433BB0">
                    <w:pPr>
                        <w:spacing w:line="360" w:lineRule="auto"/>
                        <w:rPr>
                            <w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
                            <w:sz w:val="24"/>
                            <w:szCs w:val="24"/>
                        </w:rPr>
                    </w:pPr>
                    <w:r w:rsidRPr="001509B0">
                        <w:rPr>
                            <w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
                            <w:b/>
                            <w:sz w:val="24"/>
                            <w:szCs w:val="24"/>
                        </w:rPr>
                        <w:t>ABC</w:t>
                    </w:r>
                </w:p>
            </w:tc>
        </w:tr>
        <w:tr w:rsidR="00090366" w:rsidRPr="001509B0" w:rsidTr="006623B3">
            <w:tc>
                <w:tcPr>
                    <w:tcW w:w="0" w:type="auto"/>
                    <w:gridSpan w:val="2"/>
                </w:tcPr>
                <w:p w:rsidR="00090366" w:rsidRPr="001509B0" w:rsidRDefault="00FC507E" w:rsidP="0031172A">
                    <w:pPr>
                        <w:spacing w:line="360" w:lineRule="auto"/>
                        <w:rPr>
                            <w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
                            <w:sz w:val="24"/>
                            <w:szCs w:val="24"/>
                        </w:rPr>
                    </w:pPr>
                    <w:proofErr w:type="spellStart"/>
                    <w:r>
                        <w:rPr>
                            <w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
                            <w:sz w:val="24"/>
                            <w:szCs w:val="24"/>
                        </w:rPr>
                        <w:t>Burak</w:t>
                    </w:r>
                    <w:proofErr w:type="spellEnd"/>
                    <w:r>
                        <w:rPr>
                            <w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
                            <w:sz w:val="24"/>
                            <w:szCs w:val="24"/>
                        </w:rPr>
                        <w:t xml:space="preserve"> </w:t>
                    </w:r>
                    <w:proofErr w:type="spellStart"/>
                    <w:r>
                        <w:rPr>
                            <w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
                            <w:sz w:val="24"/>
                            <w:szCs w:val="24"/>
                        </w:rPr>
                        <w:t>Kilic</w:t>
                       </w:r>
                    <w:proofErr w:type="spellEnd"/>
                    <w:r w:rsidR="00090366" w:rsidRPr="001509B0">
                        <w:rPr>
                            <w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"/>
                            <w:sz w:val="24"/>
                            <w:szCs w:val="24"/>
                        </w:rPr>
                        <w:t xml:space="preserve"> </w:t>
                    </w:r>
                </w:p>
            </w:tc>
            </w:tr>
            </w:tbl>

这是我的基本XSLT:

<xsl:template match="/">
    <html>
        <head>
            <title/>
        </head>
        <body>
            <table width="400" cellpadding="1" border="1">


                <tbody>
                <tr>
                    <td>    <xsl:apply-templates select="w:document/w:body/w:tbl"/></td>
                </tr>

            </tbody>
            </table>
        </body>
    </html>
</xsl:template>

期望的结果是:enter image description here

我想知道如何以这种方式对元素进行排序并创建像这样的行和列。它不必以相同的方式,但我只需要想法如何使用XSLT 2.0

1 个答案:

答案 0 :(得分:1)

您目前正在选择w:tbl元素,因此您需要一个与之匹配的模板,您可以在其中输出包含<table>标记。

通过查看输入示例,w:tr元素对应于表格行,w:tc对应于表格单元格,因此您需要选择这些元素并将其与模板匹配。

尝试将此XSLT作为入门者

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:w="w">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
        <html>
            <head>
                <title/>
            </head>
            <body>
                <xsl:apply-templates select="//w:tbl"/>

            </body>
        </html>
    </xsl:template>

    <xsl:template match="w:tbl">
        <table width="400" cellpadding="1" border="1">
            <tbody>
                <xsl:apply-templates select="w:tr"/>
            </tbody>
        </table>
    </xsl:template>

    <xsl:template match="w:tr">
        <tr>
            <xsl:apply-templates select="w:tc"/>
        </tr>
    </xsl:template>

    <xsl:template match="w:tc">
        <td>
            <xsl:if test="w:tcPr/w:gridSpan">
                <xsl:attribute name="colspan" select="w:tcPr/w:gridSpan/@w:val" />
            </xsl:if>
            <xsl:value-of select=".//w:t" separator="" />
        </td>
    </xsl:template>
</xsl:stylesheet>

请注意代码如何处理colspan属性。您需要为创建rowspan属性添加类似的条件(您当前的XML示例已被删节,并且不包含任何行跨度,尽管您的输出表明存在一些)。