我正在我的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中使用它...
答案 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" />