0

我正在使用 javax.xml.transform.Transformer 使用 XSL 解析器将 XHTML 转换为 XSL-FO。但是我拥有的解析器无法将样式属性复制到 XSL-FO。那么,您能否帮助使用有效的解析器,该解析器应该能够将具有样式属性的 XHTML 解析为 XSL-FO。

4

1 回答 1

1

您可以扩展这个简单的示例,使用选择结构来消除/更改名称以识别 XSL FO 属性。HTML 中有一些东西,比如以“-moz”开头的样式,在 XSL FO 中可能没有任何意义。其他一些需要进行调整。您还需要处理不在属性中的直接属性(如@colspan或) 。@rowspan@style

鉴于这个简单的输入:

<p style="font-size:12pt; font-weight:bold; color: red">This is a sample</p>

使用这个 XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="2.0">
<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match="p">
    <fo:block>
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates/>
    </fo:block>
</xsl:template>
<xsl:template match="@style">
    <xsl:variable name="styleList" select="tokenize(.,';')"/>
    <xsl:for-each select="$styleList">
        <xsl:attribute name="{normalize-space(substring-before(.,':'))}">
            <xsl:value-of select="normalize-space(substring-after(.,':'))"/>
        </xsl:attribute>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

你得到这个输出:

<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" font-size="12pt" font-weight="bold" color="red">This is a sample</fo:block

您可以看到该tokenize()函数将@style属性拆分为多个部分,这些部分用于创建适当的 XSL FO 属性。

使用类似方法的网站链接如下。它有一个非常复杂的 XSL 用于处理内联@style到 XSL FO 属性。

Cloudformatter CSStoPDF

于 2021-03-31T18:41:23.990 回答