Стайлинг в 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>