0

我正在使用 XSL-FO 和 FOP 生成 PDF。我正在将复杂的 HTML 页面转换为 PDF。

我遇到了以下错误:

遇到未知格式对象“{}br”(p 的子级)。(没有可用的上下文)

FOP 处理器不理解我提供的 XSL-FO 的格式,因为其中仍有一些 HTML 标记。我想在下面链接的 xml 中过滤<p>和标记:<br/>

http://www.tekstenuitleg.net/xmlinput.xml

在最后一位中,在“Tab element 1”和“Tab element 2”下,您可以看到FOP 无法理解的<p>和。<br/>

你能帮我用 XSLT 过滤掉这些并用 替换它们<fo:block>some replacement here</fo:block>吗?我尝试了许多不同的 XSLT 样式表,但它们都不太奏效。我将 XSLT 恢复到一开始的样子。下面的 XSLT 不会失败,但也不会进行任何转换。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="no"/>
    <xsl:template match="/">
        <xsl:copy-of select="*"/>
    </xsl:template>
</xsl:stylesheet>

我应该向这个 XSLT 添加什么来替换源 XML 中的<p>and<br>标记?

4

3 回答 3

1

我假设您的意思是要删除物理 P/BR 标签但保留其内容。

在这种情况下,请参阅此 XMLPlayground 会话(请参阅输出源中的 XML)

http://www.xmlplayground.com/9OE0NI

迭代模板执行以下两件事之一:

  • 如果当前节点是 P/BR,则只输出其内容,不输出标签
  • 否则,输出标签和内容

...然后递归子节点。

于 2012-06-08T14:47:52.133 回答
0

每个元素都需要一个模板:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="no"/>
    <xsl:template match="p">
        <xsl:copy-of select="*" />
    </xsl:template>
    <xsl:template match="br">
        <!-- -->
    </xsl:template>
</xsl:stylesheet>
于 2012-06-08T14:44:54.900 回答
0

对于那些感兴趣的人,这是我用来替换<br><p>标记的 XSL。你需要 xmlns:fo="http://www.w3.org/1999/XSL/Format 是你想像输出 XSLFO<fo:block>

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output omit-xml-declaration="yes" indent="yes" />

<xsl:template match="/">
    <xsl:apply-templates select='*' />
</xsl:template>

<xsl:template match='*'>
    <xsl:choose>
        <xsl:when test='name() = "p"'>
            <fo:block>
              <xsl:value-of select='.' />
            </fo:block>
        </xsl:when>
        <xsl:when test='name() = "br"'>
             <fo:block></fo:block>
        </xsl:when>
        <xsl:otherwise>
            <xsl:copy select='.' />
        </xsl:otherwise>
    </xsl:choose>
    <xsl:apply-templates select='*' />
</xsl:template>

于 2012-06-08T15:37:46.253 回答