2016-01-22 54 views
0

我需要抓取幾張圖片,並將它們放到通過Apache FOP生成的pdf中。在eXist之外,我沒有問題。使用eXist,模板無法正常工作,輸出中沒有圖像 - 可能是路徑存在問題。eXist-db - XSLT中的路徑

的「文件」的結構是:

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製作期間收集圖像時,這沒有問題。

UPDATE

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

你有辦法檢查創建的FO嗎? src'屬性是否爲空? –

+0

對於我來說,我試圖弄清楚發生了什麼,但它與源代碼中的相同。我會再次確保。但我想這個問題可能在別的地方。 –

回答

1

的XSL-FO處理器有不知道如何從這些URL的圖像,因爲它並不知道在哪裏解決對這些路徑。

您應該改用了XSL-FO處理器可以取消引用,因此,例如,如果你的形象在這個路徑存儲中不存在絕對網址:

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

你應該使用的網址:

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

我假設eXist正在localhost端口8080上運行,如果沒有,那麼只需調整上面的URL以反映您的設置。

+0

謝謝!它的工作原理非常合理!但是,在我將問題標記爲已回答之前,如果我完全禁用了eXist的REST功能(在O'Reilly的新書中推薦),該怎麼辦?有沒有解決方法? –

+0

基本上你的XSL-FO處理器知道如何訪問絕對URI。如果你想禁用REST API,你可以考慮在WebDAV或RESTXQ API中使用URI。如果你想禁用這些文件,你可以用'$ EXIST_HOME/webapp/WEB-INF/data/fs'解決你的二進制文件路徑,這是eXist實際放置你的二進制文件的地方。所以,如果你的$ EXIST_HOME是'/ usr/local/eXist',你可以傳遞如下的URL:'files:/// usr/local/eXist/webapp/WEB-INF/data/fs/db/apps /卡羅萊姆-應用/數據/ IMG/tealover.jpg'。但是這種方法沒有證件/脆弱性。 – adamretter

+0

另外,eXist O'Reilly的書只建議禁用你不需要的東西。你仍然可以使用REST API,但是如果你願意的話,不能讓任何人訪問它。 – adamretter

0

看來這做的伎倆:

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

UPDATE

有趣!起初它像一個魅力。後來,我稍微重新安排了項目的結構(但文檔附近的環境幾乎相同),現在它不起作用。它的日誌:

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] 

無法理解此刻這樣微小的細節。

+0

如果您執行'base-uri(root (。))?? – adamretter

+0

同樣的錯誤,我正在密集測試,看起來XSLT方法似乎是專注於調整FO處理器,現在它可以在'fop中提供''。 conf'通過'rest'動態地提供給'render-fop()'函數和圖像的絕對路徑。然而,與字體和''不一樣,即使它們真的可以通過'rest'真的不滿意這個東西 –

+0

在這裏回答: http://stackoverflow.com/questions/35038690/images-in-xsl-fo-in-exist-db/35083165#35083165 –