有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

xml使用xalan扩展在XSL中处理java集合

我想迭代ArrayList <String>并将所有字符串放到输出树中,但不知道如何做

java方法:

public ArrayList<String> getErrorList(String name) {
    if (errorMap.containsKey(name)) {
        return errorMap.get(name);
    }
    return new ArrayList<>();
}

xsl文档:

<xsl:variable name="list">
    <xsl:value-of select="validator:getErrorList($validator, 'model')"/>
</xsl:variable>

<tr>
    <td style="color: red;">
        <ul>
            <li> first string from ArrayList </li>
            . . .
            <li> last string from ArrayList </li>
        </ul>
    </td>
</tr>

共 (2) 个答案

  1. # 1 楼答案

    必须在样式表中为Java扩展函数定义名称空间。 它应该看起来像xmlns:yourchoice = "javapackage.classname。 假设getErrorList方法位于ErrorListClass类中,它可能如下所示:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:validator="mypackage.ErrorListClass"
    exclude-result-prefixes="filecounter" version="1.0">
    

    然后在XSLT中调用它

    <xsl:variable name="list">
    <xsl:value-of select="validator:getErrorList($validator, 'model')"/>
    </xsl:variable>
    
  2. # 2 楼答案

    您的错误是初始化变量,例如

    <xsl:variable name="list">
        <xsl:value-of select="validator:getErrorList($validator, 'model')"/>
    </xsl:variable>
    

    因为xslt认为,这个变量的值是#STRING,所以会出现错误

    For extension function, could not find method java.util.ArrayList.size([ExpressionContext,] #STRING).

    您必须使用下一个声明,而不是上一个声明:

    <xsl:variable name="list" select="validator:getErrorList($validator, 'model')"/>
    

    因此,方法getErrorList将返回ArrayList对象。 下一段代码将向您展示如何使用XSL functional迭代ArrayList集合:

    <xsl:variable name="list" select="validator:getErrorList($validator, 'model')"/>
    <xsl:variable name="length" select="list:size($list)"/>
    <xsl:if test="$length > 0">
        <xsl:call-template name="looper">
            <xsl:with-param name="iterations" select="$length - 1"/>
            <xsl:with-param name="list" select="$list"/>
        </xsl:call-template>
    </xsl:if>
    . . .
    <xsl:template name="looper">
        <xsl:param name="iterations"/>
        <xsl:param name="list"/>
        <xsl:if test="$iterations > -1">
            <xsl:value-of select="list:get($list, $iterations)"></xsl:value-of>
            <xsl:call-template name="looper">
                 <xsl:with-param name="iterations" select="$iterations - 1"/>
                   <xsl:with-param name="list" select="$list"/>
              </xsl:call-template>
         </xsl:if>
    </xsl:template>
    

    所以,必须使用递归,因为在函数式语言(比如XSLT)中不可能使用循环。你可以读到here