2012-12-19 75 views
0

我有一個XSL,用於創建XML的副本,但只添加了一些屬性添加到XML中的某些元素。該XSL調用返回類型CINFO的對象是列表(java.util.List中)的Java函數目前定義爲一個非常簡單的類如下:XSLT 2.0 - 迭代Java對象列表

public class CInfo { 
    public int getNewVal() { 
     return 12345; 
    } 
} 

我現在面臨着一個的問題在XSL下面的代碼片段:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
    xmlns:list="java.util.List" 
    xmlns:saxon="http://saxon.sf.net/" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    ... 
    ...> 

... 
<xsl:variable name="infoList" 
    select="up:computeUpdates($updator)"/> 

<xsl:for-each select="$infoList"> 
    <xsl:variable name="cinfo" select="."/> 
    <xsl:variable name="newVal" select="ci:getNewVal($cinfo)"/> 
... 
... 
</xsl:for-each> 

computeUpdates(),我證實確實正在通過XSL調用,返回一個包含類型CINFO的只是一個實例列表。問題出現的的xsl:for-每個它提供了以下錯誤:

Error on line 89 
    XPTY0019: Required item type of first operand of '/' is node(); supplied value has item 
    type java:com.mproj.mpkg.CInfo 
    at xsl:for-each (#76) 
    processing "com.mproj.mpkg.." 
    at xsl:apply-templates (#48) 

不知何故,XSL似乎並不能夠遍歷infoList。奇怪的是,我正在使用的代碼庫中現有的XSL對於每個都有一個非常類似的,並且能夠遍歷另一個類的Java對象列表(類似於CInfo,但是),似乎沒有給出任何問題。我錯過了什麼嗎?使XSLT迭代Java對象列表的標準過程是什麼?任何可以幫助我的例子嗎?我試圖在網絡上搜索這種循環的例子,並提出瞭解決上述問題的可能的解決方案,但目前爲止尚未成功。

回答

1

您沒有向我們顯示第89行,出現錯誤。我的猜測是,它可能包含表單

$ infoList的表達/ XXXXX

這是失敗,因爲(作爲錯誤消息解釋)的LH操作「/」必須是節點序列。

+0

或實際上'for-each'(其上下文「節點」是'CInfo'對象,而不是節點)內的任何相對XPath表達式。 –

+0

感謝您的快速響應!我完全錯過了錯誤是由_for-each_塊內的一行(#89)而不是_for-each_本身造成的。該行具有以下內容: ' 正如Michael和Ian正確指出的那樣,是不正確的。將_select_表達式修改爲'「$ topNode/Elem1/Elem2 [@low = $ a]/..」後,XSL似乎正在工作。謝謝您的幫助! – so1