使用for-each迭代从java调用返回的集合

时间:2018-03-20 18:30:23

标签: xslt xslt-1.0 xslt-2.0 xalan

我正在重写一些XSLT 2.0模板,使它们与XSLT 1.0兼容(Xalan处理器)。我们正在使用从java调用获得的集合的迭代。但是,如果我尝试使用for-each和Xalan迭代这些集合,我会得到

Can not convert #UNKNOWN (java.util.LinkedHashMap) to NodeList!

有什么方法可以做到这一点,还是仅限XSLT 2.0?换句话说:我是否需要自己将所有集合转换为NodeSet?似乎nodeset扩展不是这种情况,因为它将集合转换为包含原始集合的所有项目的一个项目节点集。

编辑:

以前我们使用Saxon,请参阅模板片段

<xsl:variable name="profilesTable" select="javaEagle:getAllProfileInfo()"/>
        <xsl:variable name="profilesList" select="javaEagle:getProfileList()"/>
        <xsl:variable name="loopInc" select="0"/>
        <xsl:variable name="profileSize" select="set:size($profilesList)"/>
        <xsl:if test="map:size($profilesTable) > 0">
            <table>
                <tgroup cols="{$profileSize}">
                    <colspec colnum="propertyName" colname="propertyName" colwidth="1*"/>
                    <xsl:for-each select="$profilesList">
                        <xsl:variable name="loopInc" select="$loopInc + 1" />
                        <colspec colnum="{$loopInc}" colname="col{$loopInc}" colwidth="1*"/>
                    </xsl:for-each>
                    <thead>
                        <row>
                        <entry valign="top">Module Property Name</entry>
                            <xsl:for-each select="$profilesList">
                                <entry valign="top"><xsl:value-of select="."/></entry>
                            </xsl:for-each>
                        </row>
                    </thead>
                    <tbody>
                        <xsl:for-each select="common:node-set(map:keySet($profilesTable))">
                            <xsl:variable name="key" select="."/>
                            <row>
                                <entry id="{$key}" namest="col1" nameend="col{$profileSize}" align="left"><b><xsl:value-of select="$key"/></b></entry>
                                    <xsl:variable name="properties" select="map:get($profilesTable, string($key))"/>

有问题的代码部分是:

<xsl:for-each select="common:node-set(map:keySet($profilesTable))">
<xsl:variable name="key" select="."/>
... do somenthing with keys

$ profilesTable是从java调用返回的HashMap。

没有常见:nodeset扩展我收到错误

   Can not convert #UNKNOWN (java.util.LinkedHashMap) to NodeList!

使用common:nodeset,它似乎循环遍历整个节点集作为一个项目。

所以问题是如何使用xalan处理器迭代返回的hashmap的键。

EDIT2:

简化示例:

<xsl:template match='/'>    
        <xsl:variable name="profilesTable" select="CustomFunctionsEagle:getAllProfileInfo()"/>
        <xsl:if test="map:size($profilesTable) > 0">
            <table>
                <tbody>
                    <xsl:variable name="keys" select="common:node-set(map:keySet($profilesTable))"/>
                    <AllKeys><xsl:value-of select="$keys"/></AllKeys>
                    <xsl:for-each select="$keys/*">
                        <xsl:for-each select="/"> 
                            <GlobalVariable><xsl:value-of select="."/></GlobalVariable>     
                        </xsl:for-each>
                    </xsl:for-each>
                </tbody>
            </table>
        </xsl:if>
    </xsl:template>

输出:

<?xml version="1.0" encoding="utf-8"?>
<table>
    <tbody>
        <AllKeys>[/AccountState/BW.HOST.NAME, .... another keys]</AllKeys>
    </tbody>
</table>

预期:

<table>
    <tbody>
        <AllKeys>[/AccountState/BW.HOST.NAME, .... another keys]</AllKeys>
        <GlobalVariable>/AccountState/BW.HOST.NAME</GlobalVariable>
        <GlobalVariable>... another keys</GlobalVariable>
    </tbody>
</table>

0 个答案:

没有答案