3

我已经浏览了所有类似问题的帖子,但无法解决我的问题。我有如下所示的 XSLT:

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

无法在这里找到问题。有人可以帮助我吗?

谢谢和问候, 里金

4

2 回答 2

0

您需要transformer.setParameter从 Java 中删除调用,并<xsl:param name="proxy" />从 XSLT 中删除相应的指令。

然后将命名空间前缀绑定到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是做什么用的,但我想它不属于那里。

于 2013-06-20T17:29:26.757 回答
0

尝试使用 XSLT 2.0 '样式表' 进行转换时出现此错误,但我使用的是 XSLT 1.0 解析器。

我不确定这是否适用于您的错误。出于这个原因,我在stackoverflow中发布了一个单独的问答:为什么我会得到以下异常'非静态Java函数的第一个参数'?

于 2015-04-08T12:37:06.017 回答