首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将HTML转换为CALS表?

将HTML转换为CALS表?
EN

Stack Overflow用户
提问于 2011-01-07 23:06:40
回答 4查看 2.8K关注 0票数 5

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

如果我自己走得足够远,我会把它贴出来供将来参考。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-28 14:47:00

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

代码语言:javascript
复制
<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=“宽度: 50%”更改为width="50%“等细节,但我认为这些都是相对常见的问题。

票数 4
EN

Stack Overflow用户

发布于 2015-11-08 18:29:16

我知道这是4年后的事了,但对于可能遇到的人来说:

ISOSTS XHTML table to CALS conversion

票数 1
EN

Stack Overflow用户

发布于 2019-04-24 03:54:01

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

要将.docx文档的表格转换为CALS格式,可以执行以下操作:

代码语言:javascript
复制
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格式即将推出(欢迎投稿)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4626873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档