Стайлинг в xsl-fo

У меня проблема с пониманием стиля в xsl-fo. Ситуация выглядит так, у меня есть таблица, и я хочу стилизовать метки для этой таблицы (для каждой строки, ее первой записи). Но только за одним столом. Какой лучший способ сделать это?

<table frame="none" outputclass="prefaceTable">
      <tgroup cols="2">
        <colspec colname="COLSPEC0"  colwidth="0.2*" />
        <colspec colname="COLSPEC1"  colwidth="1.0*"/>
        <tbody>
          <row> 
            <entry align="right">Copyright</entry>
            <entry ><p conref="copyright.dita#copyright/statement"></p>
              </entry>
          </row>
          <row>
            <entry align="right">Intended Purpose</entry>
            <entry ><p conref="intendedpurpose.dita#intendedpurpose/statement" ></p></entry>
          </row>
          <row>
            <entry align="right">Conventions Used</entry>
            <entry><p conref="ConventionsUsed.dita#ConventionsUsed/statement"></p></entry>
          </row>
        </tbody>
      </tgroup>
    </table>

РЕДАКТИРОВАТЬ ПОСЛЕ РЕШЕНИЯ:

И должен был быть стилизован в xsl-fo. В основном с помощью @Radu и @Kevin мне удалось это сделать, но мне пришлось изменить это немного больше, поскольку у нас есть DITA 2.0.1, который также в значительной степени изменился. Но в большинстве случаев должно работать решение, данное @Radu (с заменой следующего-родного брата на предыдущий-родного брата) и @Kevin (конечно, с изменением td's на записи). В моем случае это не так, потому что из того, что я видел, плагины, которые мы проверяем, последняя ли это ячейка, и другие подобные вещи, так что просто переписать ячейку было не так просто.

2 ответа

Решение

Возможно, вы можете установить атрибут @outputclass для таблицы с определенным пользовательским значением. Затем из кода XSLT вы можете сопоставить записи, такие как:

<xsl:template match="*[contains(@class, ' topic/table ')][@outputclass='specialFirstCell']/*/*[contains(@class, ' topic/tbody ')]/*[contains(@class, ' topic/row ')]/*[contains(@class, ' topic/entry ')][not(following-sibling::*[contains(@class, ' topic/entry ')])]">
            <fo:table-cell xsl:use-attribute-sets="tbody.row.entry">
                <xsl:attribute name="color">red</xsl:attribute>
                <xsl:call-template name="commonattributes"/>
                <xsl:call-template name="applySpansAttrs"/>
                <xsl:call-template name="applyAlignAttrs"/>
                <xsl:call-template name="generateTableEntryBorder"/>
                <fo:block xsl:use-attribute-sets="tbody.row.entry__content">
                    <xsl:call-template name="processEntryContent"/>
                </fo:block>
            </fo:table-cell>
        </xsl:template>

Непонятно, с чем все вы работаете. Было бы намного лучше, если бы вы опубликовали несколько ясных XML и XSL для работы. Допустим, вы работаете с простыми тегами, такими как table, tr и td.

Ваша специальная таблица помечена как @class='special' ...

В совпадении, которое вы имели бы для потомка ячейки (предполагая, что это td), вы должны написать:

    <xsl:template match="td[ancestor::table[@class='special']]">
    <xsl:choose>
        <xsl:when test="count(preceding-sibling::td) = 0">
            <!-- your special cell -->
        </xsl:when>
        <xsl:otherwise>
            <!-- all other cells in the special table-->
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
Другие вопросы по тегам