【问题标题】:Need some help doing a XML / XSLT transformation需要一些帮助来进行 XML / XSLT 转换
【发布时间】:2012-06-08 14:28:23
【问题描述】:

我正在使用 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 中的 &lt;p&gt; 和 &lt;br&gt; 标记?

【问题讨论】:

    标签: html xslt transformation


    【解决方案1】:

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

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

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

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

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

    ...然后递归子节点。

    【讨论】:

    • 感谢您的示例。我通过将 xsl-fo 命名空间添加到 xslt 文件并将您的示例更改为我的需要解决了这个问题。
    【解决方案2】:

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

    <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>
    

    【讨论】:

      【解决方案3】:

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

      <?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>
      

      【讨论】:

      • 嗯,我认为这可行,但在应用此 XSLT 时,我实际上遗漏了很多源 XML。并且转换器不接受 xsl:copy 元素上的 select 属性...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      相关资源
      最近更新 更多