使用xslt样式表将xhtml空行转换为XSL-FO空行

时间:2010-02-24 17:15:39

标签: html xslt insert

我正在使用XSLT样式表(由Antennahouse)将XHTML转换为XSL-FO文件。我在我的XHTML文件中将一个空行定义为2个连续的HTML BR标记。现在,XSL-FO格式的空白行没有原生支持。我想通过在样式表为BR标记插入的fo:block中添加一个高度来解决这个限制。但是,我是XSLT语言的新手,我在这方面遇到了一些问题。

我可以弄清楚如何为我遇到的每个BR标签插入这个高度,但我只希望在有2个BR标签之后插入空白行(否则在每个文本之后插入一个空行通过BR标签。)

我得到了一个'废话'表达式(11大于10),它将定义何时插入常规的fo:block或fo:block with space-after =“1em”。显然这个表达没有意义,应该检查的是这个BR元素是否是连续的第二个元素。如果有人能帮助我或指出我正确的方向,我将不胜感激。 这就是我现在所拥有的:

<xsl:template match="html:br">
<xsl:choose>
    <xsl:when test="11 &gt; 10">
        <fo:block space-after="1em">
            <xsl:call-template name="process-common-attributes"/>
        </fo:block>
    </xsl:when>
    <xsl:otherwise>
        <fo:block>
            <xsl:call-template name="process-common-attributes"/>
        </fo:block>
    </xsl:otherwise>
  </xsl:choose>

为了参考起见,这是一段XHTML,我希望将双BR标签转换为空行,但单个BR标签应该只是一个常规的换行符。

                  <div style="color: #000000; font-family: arial; font-size: 10pt; font-style: normal; font-weight: normal;">
                    <span>description</span>
                    <br/>
                    <span>using</span>
                    <br/>
                    <span>multiple</span>
                    <br/>
                    <span>lines</span>
                    <br/>
                    <br/>
                    <span>with</span>
                    <br/>
                    <br/>
                    <span>blank</span>
                    <br/>
                    <br/>
                    <span>lines</span>
                    <br/>
                </div>

2 个答案:

答案 0 :(得分:4)

有些事情。

仅匹配直接后跟元素(<br>)的following-sibling::*[1]<br>[self::html:br]):

<xsl:template match="html:br[following-sibling::*[1][self::html:br]]">
  <fo:block space-after="1em" />
</xsl:template>

并丢弃那些直接在<br>之前的<br>,以避免空格加倍。通过将它们与空模板匹配,它们将被有效删除:

<xsl:template match="html:br[preceding-sibling::*[1][self::html:br]]" />

答案 1 :(得分:0)

我正在玩多个换行符的想法。

<xsl:template match="html:br">
   <fo:block linefeed-treatment="preserve">
    <xsl:text>&#10;</xsl:text>
  </fo:block>
</xsl:template>