2012-10-31 35 views
3

我想迭代ArrayList <String>並將所有字符串都放到輸出樹上,但是不知道該怎麼做。使用xalan擴展在XSL中使用java集合

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> 

我是很新,XSL,所以我要問你的幫助。

回答

5

你的錯誤是初始化變量如

<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對象。 接下來代碼將告訴您如何遍歷ArrayList集合,使用XSL功能:

<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

+0

謝謝!這對我很好! – bsiamionau

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> 

我希望幫助。

最好的問候, 彼得

+0

謝謝你的回答,但很明顯。我的問題是迭代收到的列表。我想獲得所有這個ArrayList考慮的字符串。 – bsiamionau