3

我想迭代ArrayList <String>并将所有字符串放入输出树,但不知道该怎么做。

方法:

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>
4

2 回答 2

6

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

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

因为 xslt 认为,这个变量的值是#STRING,所以你会得到错误

对于扩展函数,找不到方法 java.util.ArrayList.size([ExpressionContext,] #STRING)。

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

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

因此,方法getErrorList将返回ArrayList对象。接下来的代码将向您展示如何使用 XSL 函数迭代 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。你可以在这里阅读

于 2012-10-31T14:22:55.093 回答
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>
于 2012-10-31T13:05:43.520 回答