【问题标题】:HTML to CALS tables?HTML 到 CALS 表?
【发布时间】:2011-01-07 15:06:40
【问题描述】:

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

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

【问题讨论】:

  • 请提供一个小例子:1. (x)Html。 2.想要的结果。包括我在内的很多人都不知道 CALS 表是什么。
  • 从上一个 OASIS spec 看来,转换主要是 tr -> rowtd -> entry
  • 我只是提出这个问题,看看是否有人存档了一些东西。稍后我会添加一些示例代码。

标签: html xslt html-table


【解决方案1】:

我想出了一个比@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 > 1 的单元格创建正确的数字列!我的样式表中的第一个模板就是这样做的,基于@Tim C 对max cells per row problem 的回答。

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

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

【讨论】:

  • 谢谢!我的项目改变了,没有机会再次回到它。我一定会记住这一点,因为我知道它会再次出现。谢谢!
【解决方案2】:

我知道是 4 年后的事了,但为可能遇到的人发帖:

ISOSTS XHTML table to CALS conversion

【讨论】:

    【解决方案3】:

    我知道这是一个迟到的答案,但我目前正在开发一个 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 格式即将推出(欢迎投稿)。

    【讨论】:

      【解决方案4】:

      虽然我不明白具体的困难,但我搜索了一些:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-03
        • 1970-01-01
        • 2018-12-27
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        • 2020-05-29
        • 2018-07-13
        相关资源
        最近更新 更多