使用参数从Java执行XSLT转换

时间:2011-10-06 22:06:45

标签: java xslt

我正在我的java Web应用程序中执行XSLT转换,没有任何问题,如下所示:

Transformer transformer = TransformerFactory.newInstance().newTransformer(xslSource);
transformer.transform(xmlInput, xmlOutput);

在我的XSLT转换中,我现在正在添加对document()函数的调用,以从RESTful Web服务加载响应:

<!-- do stuff -->
<xsl:variable name="url">
   http://server/service?id=<xsl:value-of select="@id"/>
</xsl:variable>
<xsl:call-template name="doMoreStuff">
   <xsl:with-param name="param1" select="document($url)/foo"/>
</xsl:call-template>

好酷,没问题。但现在,我想从java中的utils类中读取基本URL并将其传递给样式表。

//java
String baseUrl = myUtils.getBaseUrl();

<!-- xslt -->
<xsl:variable name="url">
   <xsl:value-of select="$baseUrl"/>
   <xsl:text>/service?id=</xsl:text>
   <xsl:value-of select="@id"/>
</xsl:variable>

有关如何执行此操作的任何建议吗?我的Java utils类从类路径上的myApp.properties文件中加载值,但我不确定我是否可以从XSLT中使用它...

2 个答案:

答案 0 :(得分:7)

在样式表中声明xsl:param,以便在调用时传递baseUrl值:

<xsl:param name="baseUrl" />

Transformer对象上设置参数:

Transformer transformer = TransformerFactory.newInstance().newTransformer(xslSource);
transformer.setParameter('baseUrl', myUtils.getBaseUrl());
transformer.transform(xmlInput, xmlOutput);

如果您使用的是XSLT 2.0,那么在构建url变量值时可以考虑使用resolve-uri()函数:

<xsl:variable name="url" 
              select="resolve-uri(concat('/service?id=', @id), $baseUrl)" />

resolve-uri() 可以帮助补偿baseUrl中的尾部斜杠,主题标签和其他内容,否则可能会通过简单地连接{{{{}}来构建无效的URL 1}}使用片段和$baseUrl

答案 1 :(得分:6)

使用参数的名称和值在Transformer实例上调用setParameter。然后在您的XSLT文档中使用<xsl:param name="yourParamName" />声明参数,然后您可以在XSLT中使用它,例如:<xsl:value-of select="$yourParamName" />