2013-06-20 46 views
3

我已經瀏覽了類似問題的所有文章,但無法解決我的問題。我已經XSLT,如下圖所示:從XSLT調用Java函數給出「無法編譯樣式表」

XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?> 

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:proxy="java:com.hp.gpp.pp.util.UrlUtils" 
    extension-element-prefixes="proxy"> 

    <xsl:output method="xml" version="1.0" indent="yes" /> 

    <xsl:param name="proxy" /> 
    <xsl:variable name="baseurl" 
     select="/html/head/base/@href"/> 

    <!-- copy input to output --> 
    <xsl:template match='*|@*'> 
     <xsl:copy> 
      <xsl:apply-templates select='node()|@*' /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*[@href]"> 
     <xsl:copy> 
      <xsl:attribute name="href"><xsl:value-of 
       select="proxy:rewriteRelative($proxy,$baseurl,@href)" /></xsl:attribute> 
      <xsl:apply-templates select="node()|@*[name(.)!='href']" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*[@src]"> 
     <xsl:copy> 
      <xsl:attribute name="src"><xsl:value-of 
       select="proxy:rewriteRelative($proxy,$baseurl,@src)" /></xsl:attribute> 
      <xsl:apply-templates select="node()|@*[name(.)!='src']" /> 
     </xsl:copy> 
    </xsl:template> 

    <!-- rewrite <a href> --> 
    <xsl:template match="base"> 
    </xsl:template> 

</xsl:stylesheet> 

和Java代碼:

XSLTemplateFactory templateFactory = new DefaultTemplateFactory(); 
      Templates templates = templateFactory.getTemplatesFromURL(XSS_FILE_NAME); 
Source xmlStrim = new StreamSource(reader); 
Result oStream = new StreamResult(res.getWriter()); 

Transformer transformer = templates.newTransformer(); 
transformer.setParameter("proxy", new UrlUtils(req, res)); 
transformer.transform(xmlStrim, oStream); 

不知何故,代碼工作在本地,而部署在JBoss給出:

ERROR: 'The first argument to the non-static Java function 'rewriteRelative' is not a valid object reference.' 
FATAL ERROR: 'Could not compile stylesheet' 
com.hp.gpp.pp.exception.ProxyPortletException: error.transformer : Could not compile stylesheet 

無法在此處找到問題。有人可以幫助我嗎?

感謝&問候, Rikin

+0

你知道命名空間前綴'proxy'與模板參數'proxy'無關嗎?什麼是'UrlUtils'和'rewriteRelative'?這是一個本土的圖書館嗎? – Borodin

回答

0

您需要刪除從Java的transformer.setParameter通話,然後從你的XSLT相應<xsl:param name="proxy" />指令。

然後綁定的命名空間前綴的Java類,這樣

<xsl:script implements-prefix="proxy" language="java" src="java:com.hp.gpp.pp.util.UrlUtils"/> 

然後,你可以寫

<xsl:attribute name="href"> 
    <xsl:value-of select="proxy:rewriteRelative($baseurl, @href)" /> 
</xsl:attribute> 

我認爲rewriteRelative只需要兩個參數:基本URL和相對URL?我不清楚以前的第一個參數$proxy是什麼,但我想它不屬於那裏。

+0

感謝您的回覆鮑羅廷。這裏有幾個問題: 1>正如您所看到的,UrlUtils類需要Request&Response對象來創建對象。這些對象用於重寫HREF URL。我將如何通過這些對象? 2> Transformer將如何調用UrlUtils的方法,因爲這些方法不是靜態的 - 不能使它們保持靜態。這就是rewriteRelative具有第三個參數$ proxy的原因,它被設置爲Transformer的參數。這是錯誤的方法或什麼? – Rikin