Я придумал гораздо более простое решение, чем то, что связано с @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 колонки шириной» (Объединение колонок = «3»), тогда как АСЗМТС будет говорить «эта ячейка начинается в колонке 2 и заканчивается в колонке 4» (namest = "2" nameend = "4"). Это преобразование выполняется во втором шаблоне в таблице стилей.
Остальное действительно довольно просто. В таблице стилей не рассматриваются детали, такие как изменение style = "width: 50%" в width = "50%" и т. Д., Но я считаю, что это относительно распространенные проблемы.
Пожалуйста, предоставьте небольшой пример: 1. (х) Html. 2. Желаемый результат. Многие люди, включая меня, не знают, что такое таблица CALS. –
Из последнего OASIS [spec] (http://www.oasis-open.org/specs/tm9901.html) это выглядит как преобразование в основном 'tr' ->' row' и 'td' ->' entry' –
Я просто задавал вопрос, есть ли у кого-нибудь что-то архивированное. Я скоро добавлю несколько примеров кода. – Jeff