eXist-db – XSLT 中的路径

eXist-db – paths in XSLT

我需要抓取几张图片并将它们放入通过 Apache FOP 生成的 pdf 中。在 eXist 之外,我没有任何问题。使用 eXist,模板无法正常工作,输出中没有图像——可能路径有问题。

“文件”的结构是:

project/data/file.xml
project/data/img/*pictures.jpg

测试来源:

<figure>
    <graphic url="img/tealover.jpg"/>
</figure>

<figure>
    <graphic url="./img/tealover.jpg"/>
</figure>

<figure>
    <graphic url="/db/apps/karolinum-apps/data/img/tealover.jpg"/>
</figure>

模板:

<xsl:template match="tei:figure/tei:graphic">
    <fo:block>
        <fo:external-graphic src="{@url}" xsl:use-attribute-sets="images"/>
    </fo:block>
    <xsl:apply-templates/>
</xsl:template>

问题出在哪里?我是否缺少 eXist 的某些设置?在ePub制作过程中采集图片时,这个是没有问题的。

更新

XSL-FO 输出:

<fo:block>
    <fo:external-graphic width="50%" content-height="100%" content-width="scale-to-fit" scaling="uniform" src="img/tealover.jpg"/>
</fo:block>
<fo:block>
    <fo:external-graphic width="50%" content-height="100%" content-width="scale-to-fit" scaling="uniform" src="./img/tealover.jpg"/>
</fo:block>
<fo:block>
    <fo:external-graphic width="50%" content-height="100%" content-width="scale-to-fit" scaling="uniform" src="/db/apps/karolinum-apps/data/img/tealover.jpg"/>
</fo:block>

XSL-FO 处理器不知道如何从那些 URL 中检索图像,因为它不知道在哪里解析这些路径。

您应该使用 URL 处理器可以取消引用的绝对 URLs,例如,如果您的图像存储在 eXist 中的这个路径中:

/db/apps/karolinum-apps/data/img/tealover.jpg

您应该改用 URL:

http://localhost:8080/exist/rest/db/apps/karolinum-apps/data/img/tealover.jpg.

我假设 eXist 在 localhost 端口 8080 上 运行,如果不是,则只需调整上面的 URL 以反映您的设置。

这似乎可以解决问题:

<xsl:template match="tei:figure/tei:graphic">
    <fo:block>
        <fo:external-graphic src="url('{resolve-uri(@url, base-uri(.))}')" xsl:use-attribute-sets="images"/>
    </fo:block>
    <xsl:apply-templates/>
</xsl:template>

更新

有意思!起初它就像一个魅力。后来稍微调整了一下工程结构(不过文档附近的环境几乎是一样的),现在不行了。它记录:

exerr:ERROR Exception while transforming node: Base URI {} is not an absolute URI [at line 11, column 19] In function:
fop:render-pdf(node()*) [12:5:/db/apps/karolinum-apps/modules/create-pdf.xqm]

但问题显然出在这行代码中。

即使我尝试 <xsl:value-of select="resolve-uri(@url, base-uri(.))"/>,它也会抱怨

exerr:ERROR Exception while transforming node: Base URI {} is not an absolute URI [at line 16, column 9]

暂时无法理解如此微小的细节。