我在使用基于网址的数据的apache fop工具生成pdf文件时遇到问题,只要有某些字符或关键字,例如utm或rel,如下面给出的网址
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的FOP 2.2版
myvar=mytest && /opt/fop-2.2/fop/fop -r -v -xml $myvar.xml -xsl $myvar.xsl -pdf $myvar.pdf
我尝试在网址周围添加引号,但没有效果。 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>
没有运气,还是一样。
任何帮助将不胜感激。
答案 0 :(得分:2)
将&
转发为&
。
你的问题不在于FOP,而在于你的XML语法。在XML中,&
是实体引用的开始,因此XML解析器(不是FOP本身)正在尝试评估&rel
(&
之后作为实体有效的最长序列name)作为实体名称,并未找到结束实体引用所需的;
。
答案 1 :(得分:0)
使用CDATA包装网址解决了这个问题,如下所示: -
<![CDATA[\"$url\"]]>
CDATA代表角色数据。我们使用它来逃避一些字符,否则这些字符将被视为标准的常规XML。其中的数据将不会被解析,否则您将最终得到错误,因为它将被解析为标准的常规XML。