FOP无法为某些URL生成pdf

问题描述 投票:0回答:2

我有一个问题,使用基于url的数据的apache fop工具生成pdf文件,只要有某些字符或关键字,如utm或rel,如下面给出的url

https://www.youtube.com/embed/1mDT-x2XnEg?autoplay=1&rel=0&feature=oembed&enablejsapi=1&wmode=opaque

我收到以下错误

SEVERE: Exception
org.apache.fop.apps.FOPException: The reference to entity "rel" must end with the ';' delimiter.
javax.xml.transform.TransformerException: The reference to entity "rel" must end with the ';' delimiter.

我的XML数据文件 - mytest.xml包含:

<url>https://www.youtube.com/embed/1mDT-x2XnEg?autoplay=1&rel=0&feature=oembed&enablejsapi=1&wmode=opaque</url>

我的XSL模板文件 - mytest.xsl包含

<?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 method="xml" indent="yes"/>
  <xsl:template match="/">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master master-name="A4-portrait"
              page-height="29.7cm" page-width="21.0cm" margin="2cm">
          <fo:region-body/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="A4-portrait">
        <fo:flow flow-name="xsl-region-body">
          <fo:block>
            Testing URLS: <xsl:value-of select="url"/>!
          </fo:block>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
</xsl:stylesheet>

在kali linux和opensuse linux 42.3上测试了Commandline FOP 2.2版

myvar=mytest && /opt/fop-2.2/fop/fop  -r -v -xml $myvar.xml -xsl $myvar.xsl -pdf $myvar.pdf 

我试过在URL周围添加引号,但没有效果。 Fop似乎是逐字逐句地解释网址。

我在模板中使用了basiclink标签尝试了另一个文件 - mytest.xsl

<?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 method="xml" indent="yes"/>
  <xsl:template match="/">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master master-name="A4-portrait"
              page-height="29.7cm" page-width="21.0cm" margin="2cm">
          <fo:region-body/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="A4-portrait">
        <fo:flow flow-name="xsl-region-body">
          <fo:block>

            <fo:basic-link external-destination="url({url/@href})"  color="blue" text-decoration="underline">  <xsl:value-of select="url/@href"/> </fo:basic-link>
          </fo:block>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
</xsl:stylesheet>

没有运气,还是一样。

任何帮助将不胜感激。

xml bash xsl-fo apache-fop
2个回答
2
投票

逃离&作为&amp;

你的问题不在于FOP,而在于你的XML语法。在XML中,&是实体引用的开始,因此XML解析器(不是FOP本身)试图将&rel&之后的最长序列作为实体名称)作为实体名称进行评估,并且没有找到;这是结束实体引用所必需的。

https://www.w3.org/TR/REC-xml/#sec-references


0
投票

使用CDATA包装网址解决了这个问题,如下所示: -

<![CDATA[\"$url\"]]>

CDATA代表字符数据。我们使用它来逃避一些字符,否则这些字符将被视为标准的常规XML。其中的数据将不会被解析,否则您将最终得到错误,因为它将被解析为标准的常规XML。

© www.soinside.com 2019 - 2024. All rights reserved.