在xsl-fo中定型

时间:2015-09-25 07:33:17

标签: xsl-fo dita

我在理解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&t更改为条目)应该可行。在我的情况下,它没有,因为从我看到的插件,我们检查它是否是最后一个单元格和其他类似的东西,所以它不容易覆盖单元格。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

目前尚不清楚你们正在做什么。如果您发布了一些明确的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>