使用参数从Java执行XSLT转换

sch*_*d04 5 java xslt

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

Transformer transformer = TransformerFactory.newInstance().newTransformer(xslSource);
transformer.transform(xmlInput, xmlOutput);
Run Code Online (Sandbox Code Playgroud)

在我的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>
Run Code Online (Sandbox Code Playgroud)

好酷,没问题.但现在,我想从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>
Run Code Online (Sandbox Code Playgroud)

有关如何做到这一点的任何建议?我的Java utils类从类路径上的myApp.properties文件加载值,但我不确定我是否可以从XSLT中使用它...

Mad*_*sen 7

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

<xsl:param name="baseUrl" />
Run Code Online (Sandbox Code Playgroud)

Transformer对象上设置参数:

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

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

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

resolve-uri()可以帮助补偿尾部斜杠,主题标签和其他内容,baseUrl否则可能会通过简单地$baseUrl将片段与片段连接来构造无效的URL@id.


Cla*_*fou 6

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