gpt4 book ai didi

HTML 到 CALS 表?

转载 作者:太空狗 更新时间:2023-10-29 15:52:31 26 4
gpt4 key购买 nike

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

如果我自己走得足够远,我会发布它以供将来引用。

最佳答案

我想出了一个比@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 列开始到第 2 列结束第 4 列”(namest="2"nameend="4")。该转换是在样式表的第二个模板中完成的。

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

关于HTML 到 CALS 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4626873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com