2011-01-07 3 views
5

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

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

+1

Пожалуйста, предоставьте небольшой пример: 1. (х) Html. 2. Желаемый результат. Многие люди, включая меня, не знают, что такое таблица CALS. –

+1

Из последнего OASIS [spec] (http://www.oasis-open.org/specs/tm9901.html) это выглядит как преобразование в основном 'tr' ->' row' и 'td' ->' entry' –

+0

Я просто задавал вопрос, есть ли у кого-нибудь что-то архивированное. Я скоро добавлю несколько примеров кода. – Jeff

ответ

4

Я придумал гораздо более простое решение, чем то, что связано с @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%" и т. Д., Но я считаю, что это относительно распространенные проблемы.

+0

Спасибо за это! Мой проект изменился, и у меня не было возможности вернуться к нему снова. Я определенно буду помнить об этом, поскольку я знаю, что он снова появится. Благодаря! – Jeff

Смежные вопросы