Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HtmlFo Transformer(一个XSL文件,它应该具有将HTML的样式属性复制到FO的逻辑)_Html_Xslt_Xsl Fo_Css To Pdf - Fatal编程技术网

HtmlFo Transformer(一个XSL文件,它应该具有将HTML的样式属性复制到FO的逻辑)

HtmlFo Transformer(一个XSL文件,它应该具有将HTML的样式属性复制到FO的逻辑),html,xslt,xsl-fo,css-to-pdf,Html,Xslt,Xsl Fo,Css To Pdf,我使用javax.xml.transform.Transformer使用XSL解析器将XHTML转换为XSL-FO。但是我使用的解析器无法将样式属性复制到XSL-FO。 因此,您可以帮助使用有效的解析器,该解析器应该能够将带有样式属性的XHTML解析为XSL-FO。您可以在这个简单的示例上进行扩展,使用choose结构消除/更改名称以识别XSL-FO属性。HTML中有一些东西,比如以“-moz”开头的样式,在XSL FO中可能没有任何意义。还有一些需要调整。您还需要处理不在@style属性中的直

我使用javax.xml.transform.Transformer使用XSL解析器将XHTML转换为XSL-FO。但是我使用的解析器无法将样式属性复制到XSL-FO。
因此,您可以帮助使用有效的解析器,该解析器应该能够将带有样式属性的XHTML解析为XSL-FO。

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

考虑到这个简单的输入:

<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

这是一个示例将样式属性从HTML复制到XSL FO对您没有任何帮助。XSL FO中没有这样的属性。您需要一个处理样式并写出正确的XSL FO等效结构的XSLT。@KevinBrown是的,需要一个处理样式并写出正确的XSL FO等效结构的XSLT。。。任何关于标准XSLT的想法都可以做到这一点。您应该指定您的目标XSL版本。2.0及以上版本使用tokenize()会有点微不足道,但1.0需要递归。感谢@KevinBrown更新,是的,我使用的XSL版本是2.0。你能分享更多关于tokenize()的信息吗?或者我可以分享tokenize()信息的任何链接