HTML в CALS таблицы? - PullRequest
       15

HTML в CALS таблицы?

5 голосов
/ 07 января 2011

Я проверяю, есть ли у кого-нибудь XSLT, преобразующий HTML-таблицы в CALS.Я нашел много материала о том, как идти другим путем (CALS to HTML), но не из HTML.Я думал, что кто-то мог сделать это раньше, поэтому мне не нужно изобретать велосипед.Я не ищу полное решение.Просто отправная точка.

Если я доберусь достаточно далеко, я опубликую это для дальнейшего использования.

Ответы [ 4 ]

4 голосов
/ 28 августа 2011

Я придумал гораздо более простое решение, чем то, на что @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 клеток на строку .

Другая проблема состоит в том, что для ячеек с несколькими столбцами XHTML говорит: «эта ячейка имеет ширину в 3 столбца» ( colspan = «3» ), а CALS говорит: «эта ячейка начинается в столбце 2 и заканчивается в столбце». 4 "( namest =" 2 "nameend =" 4 "). Это преобразование выполняется во втором шаблоне таблицы стилей.

Остальное действительно довольно просто. Таблица стилей не имеет дело с такими деталями, как изменение style = "width: 50%" на width = "50%" и т. Д., Но я считаю, что это довольно распространенные проблемы.

1 голос
/ 23 апреля 2019

Я знаю, что это поздний ответ, но в настоящее время я разрабатываю библиотеку 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 скоро придет (вклад приветствуется).

1 голос
/ 08 ноября 2015

Я знаю, что это 4 года спустя, но пост для того, кто может встретиться:

Преобразование таблицы XOS XML в ISOSTS

0 голосов
/ 08 января 2011

Хотя я не понимаю конкретной трудности, я гуглил некоторые:

...