Java传递List<String>到XSLT 2.0遇问题:仅首个字符串值可获取
解决Java结合XSLT 2.0获取多字符串值的索引问题
你遇到的核心问题是Java返回的List<String>在XSLT中未被正确解析为字符串序列,导致仅能取到第一个元素,后续索引返回空值。这是因为多数XSLT处理器(如Saxon)默认不会将Java集合自动转换为XSLT的序列类型,而是把整个List当作单个节点处理。
以下是几种可行的解决方案:
方案1:修改Java函数返回数组而非List
将Java函数的返回类型从List<String>改为String[],XSLT处理器会自动将数组解析为字符串序列,索引访问即可正常工作:
Java代码调整
public static String[] myFunction(String inparam) { // 原逻辑生成List<String>后转为数组 List<String> resultList = ...; return resultList.toArray(new String[0]); }
XSLT代码保持不变
xmlns:fn="java:myFunction" <!-- Java函数返回String[] --> <xsl:variable name="returnList" as="xsd:string*" select="fn:myFunction('inparam')" /> <element><xsl:value-of select="$returnList[1]"/></element> <element><xsl:value-of select="$returnList[2]"/></element>
方案2:在XSLT中显式遍历List元素
若无法修改Java函数,可在XSLT中通过遍历方式获取所有元素,避免直接索引访问:
xmlns:fn="java:myFunction" <!-- Java函数返回List<String> --> <xsl:for-each select="fn:myFunction('inparam')"> <element><xsl:value-of select="."/></element> </xsl:for-each>
方案3:使用处理器提供的集合转序列方法
以Saxon为例,可调用其扩展方法将List转换为XSLT序列:
xmlns:saxon="http://saxon.sf.net/" xmlns:fn="java:myFunction" <xsl:variable name="javaList" select="fn:myFunction('inparam')" /> <xsl:variable name="returnList" as="xsd:string*" select="saxon:list-to-sequence($javaList)" /> <element><xsl:value-of select="$returnList[1]"/></element> <element><xsl:value-of select="$returnList[2]"/></element>
注意:使用该方法需确保XSLT处理器支持对应扩展,且配置允许外部函数调用。
内容的提问来源于stack exchange,提问作者TheUltimateHack
相关产品推荐
相关产品推荐

