HTML到CALS表?

时间:2011-01-07 15:06:40

标签: html xslt html-table

我正在检查是否有人将XSLT转换为将HTML表格转换为CALS。我发现了很多关于其他方式(CALS到HTML)的材料,但不是来自HTML。我以为有人可能会这样做,所以我不必重新发明轮子。我不是在寻找一个完整的解决方案。只是一个起点。

如果我自己走得足够远,我会发布以供将来参考。

4 个答案:

答案 0 :(得分:4)

我提出了一个比@Flack链接到的更简单的解决方案:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="tbody">
    <xsl:variable name="maxColumns">
        <xsl:for-each select="tr">
            <xsl:sort select="sum(td/@colspan) + count(td[not(@colspan)])" data-type="number"/>
            <xsl:if test="position() = last()">
                <xsl:value-of select="sum(td/@colspan) + count(td[not(@colspan)])"/>
            </xsl:if>
        </xsl:for-each>
    </xsl:variable>
    <tgroup>
        <xsl:attribute name="cols">
            <xsl:value-of select="$maxColumns"/>
        </xsl:attribute>
        <xsl:apply-templates select="@*|node()"/>
    </tgroup>
</xsl:template>

<xsl:template match="td[@colspan > 1]">
    <entry>
        <xsl:attribute name="namest">
            <xsl:value-of select="sum(preceding-sibling::td/@colspan) + count(preceding-sibling::td[not(@colspan)]) + 1"/>
        </xsl:attribute>
        <xsl:attribute name="nameend">
            <xsl:value-of select="sum(preceding-sibling::td/@colspan) + count(preceding-sibling::td[not(@colspan)]) + @colspan"/>
        </xsl:attribute>
        <xsl:apply-templates select="@*[name() != 'colspan']|node()"/>
    </entry>
</xsl:template>

<xsl:template match="tr">
    <row>
        <xsl:apply-templates select="@*|node()"/>
    </row>
</xsl:template>

<xsl:template match="td">
    <entry>
        <xsl:apply-templates select="@*|node()"/>
    </entry>
</xsl:template>

<xsl:template match="td/@rowspan">
    <xsl:attribute name="morerows">
        <xsl:value-of select=". - 1"/>
    </xsl:attribute>
</xsl:template>

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

有两个棘手的问题。首先,CALS表需要包含列数的 tgroup / @cols 属性。因此,我们需要在XHTML表中找到一行中的最大单元格数 - 但我们必须注意 colspan 声明,以便具有 colspan &gt;的单元格。 1创建正确数量的列!我的样式表中的第一个模板就是基于@Tim C对max cells per row problem的回答。

另一个问题是,对于多列单元格,XHTML表示“此单元格为3列宽”( colspan =“3”),而CALS将说“此单元格从第2列开始并以第4列“( namest =”2“nameend =”4“)。该转换在样式表的第二个模板中完成。

其余的确相当简单。样式表不处理将 style =“width:50%”更改为 width =“50%”等细节,但这些是相对常见的问题,我相信

答案 1 :(得分:1)

我知道这是4年之后,但发布给可能遇到的人:

ISOSTS XHTML table to CALS conversion

答案 2 :(得分:1)

我知道这是一个较晚的答案,但是我目前正在开发一个Python库,以轻松地将表从XML格式转换为另一种格式。

要将.docx文档的表转换为CALS格式,可以按以下步骤处理:

import os
import zipfile

from benker.converters.ooxml2cals import convert_ooxml2cals

# - Unzip the ``.docx`` in a temporary directory
src_zip = "/path/to/demo.docx"
tmp_dir = "/path/to/tmp/dir/"
with zipfile.ZipFile(src_zip) as zf:
    zf.extractall(tmp_dir)

# - Source paths
src_xml = os.path.join(tmp_dir, "word/document.xml")
styles_xml = os.path.join(tmp_dir, "word/styles.xml")

# - Destination path
dst_xml = "/path/to/demo.xml"

# - Create some options and convert tables
options = {
    'encoding': 'utf-8',
    'styles_path': styles_xml,
    'width_unit': "mm",
    'table_in_tgroup': True,
}
convert_ooxml2cals(src_xml, dst_xml, **options)

请参阅:https://benker.readthedocs.io

注意:(X)HTML格式即将推出(欢迎您提供帮助)。

答案 3 :(得分:0)

虽然我不理解特殊的困难,但我用Google搜索了一些: