我正在使用 javax.xml.transform.Transformer 使用 XSL 解析器将 XHTML 转换为 XSL-FO。但是我拥有的解析器无法将样式属性复制到 XSL-FO。那么,您能否帮助使用有效的解析器,该解析器应该能够将具有样式属性的 XHTML 解析为 XSL-FO。
问问题
44 次
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 属性。
于 2021-03-31T18:41:23.990 回答