我正在重写一些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>