2013-07-29 32 views
0

嘗試使用Grails進行一些轉換,並想知道引用問題。 我主持「/WEB-INF/xslt/{file}.xsl」下的模板和我注意到,文件有進口引用到其他文件 喜歡的東西:引用XSL模板和轉換的Grails

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:i18n="http://apache.org/cocoon/i18n/2.1"> 
<xsl:import href="file2.xsl"/> 
<xsl:import href="../xslt/file2.xsl"/> 

我知道的事實這是不正確的引用,我想知道如何在需要轉換時引用主要xsl文件中的xsl資源以便導入。

我處理這些throught他下面的代碼:

def String resources = grailsApplication.mainContext.getResource('/WEB-INF/xslt/'+xslTemplateName).file  
def String xslt = new File(resources).text 
def factory = TransformerFactory.newInstance() 
def transformer = factory.newTransformer(new StreamSource(new StringReader(xslt))) 
+1

你考慮過[freemarker](http://freemarker.org/)而不是XSL嗎?它有很好的[XML](http://freemarker.org/docs/xgui_imperative_learn.html)支持,包括[xpath](http://freemarker.org/docs/xgui_imperative_learn.html#autoid_72),你可以注入java helper對象並調用實用程序方法。我發現閱讀和維護起來要容易得多,而且比XSL更簡潔。 –

回答

1

沒有什麼錯,在進口使用相對URI,問題是通過加載XSLT的內容文件自己,然後創建從該Transformernew StreamSource(Reader)Transformer不知道它是從哪裏加載的,所以沒辦法正確解析相關的URI。相反,您應該使用StreamSource構造函數中的一個,例如systemId,例如

def xslResource = grailsApplication.mainContext.getResource(
    '/WEB-INF/xslt/'+xslTemplateName) 

StreamSource xslSource = new StreamSource(xslResource.getInputStream(), 
    xslResource.getURL().toString()) 
Transformer transformer = factory.newTransformer(xslSource) 

還請注意,你應該讓TransformerFactory讀取資源的InputStream直接使XML解析器可以檢測並使用正確的字符編碼加載文件。當您執行File.text時,它始終使用當前平臺的默認編碼,該編碼可能與<?xml?>聲明中給出的文件編碼不同。

+0

Thx爲答案。 仍然無法編譯樣式表,但接近。我注意到URL(xslResource。getURL())是錯誤的。它實際上是jndi:/localhost/mycontext/xslt/xsdFulltext.xsl,在這種情況下它缺少端口(8080)。 –

+0

原來,jndi URl是正確的!感謝您的幫助 –

+1

@Armand從'getResource'得到的URL只能在Web應用程序自己的代碼中解析,它不應該是Web訪問的(因爲通常使用getResource訪問WEB-INF下的東西',根據servlet規範,它不能被網絡訪問)。 –