我正在查看是否有人拥有将HTML表转换为CALS的XSLT。我发现了很多关于另一种方式的材料(从CALS到HTML),但不是来自HTML。我想以前可能有人这么做过,这样我就不需要重新发明轮子了。我不是在寻找一个完整的解决方案。这只是一个起点。
如果我自己走得足够远,我会把它贴出来供将来参考。
发布于 2011-08-28 14:47:00
我想出了一个比@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=“宽度: 50%”更改为width="50%“等细节,但我认为这些都是相对常见的问题。
发布于 2015-11-08 18:29:16
我知道这是4年后的事了,但对于可能遇到的人来说:
ISOSTS XHTML table to CALS conversion
发布于 2019-04-24 03:54:01
我知道这是一个迟来的回答,但我目前正在开发一个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格式即将推出(欢迎投稿)。
https://stackoverflow.com/questions/4626873
复制相似问题