XSLT中如何处理动态HashMap并根据Key获取对应List值
解决方案
首先你当前的变量声明写法存在语法问题,XSLT 3.0才支持原生映射(map)与数组(array)类型,针对动态Map的场景有两种正确的变量声明方式:
方式1:通过JSON字符串解析构造
如果你的Map结构是动态生成的JSON字符串,可以用parse-json函数解析为XSLT原生map类型,注意JSON内部引号需要转义避免和XSLT属性引号冲突:
<xsl:variable name="myMap" select="parse-json('{"key1":["value1", "value2"], "key2":["value2", "value3"]}')"/>
方式2:通过XSLT原生构造函数生成
如果是在XSLT内部动态构建Map,可以直接用内置的map、array构造函数,写法更规范:
<xsl:variable name="myMap" select="map{ 'key1': array{'value1', 'value2'}, 'key2': array{'value2', 'value3'} }"/>
按Key获取对应List的实现方法
XSLT 3.0支持两种通用的Map取值写法:
简化问号语法
固定Key的场景可以直接在变量后加?加Key名取值:
<!-- 获取key1对应的List数组 --> <xsl:variable name="key1List" select="$myMap?key1"/>
如果Key是动态存储在其他变量中,可以用?($变量名)的写法适配:
<xsl:variable name="targetKey" select="'key2'"/> <!-- 动态获取key2对应的List数组 --> <xsl:variable name="key2List" select="$myMap?($targetKey)"/>
标准map函数写法
也可以用官方提供的map:get函数实现取值,兼容性更强:
<xsl:variable name="key1List" select="map:get($myMap, 'key1')"/>
List数组的后续遍历操作
拿到数组后如果需要遍历所有元素,可以把数组转为序列后用普通xsl:for-each处理:
<!-- 遍历输出key1对应List的所有值 --> <xsl:for-each select="$myMap?key1?*"> <xsl:value-of select="."/> </xsl:for-each>
注意:以上功能均基于XSLT 3.0版本实现,需要使用支持XSLT 3.0的处理器(如Saxon 9.8及以上版本)才能正常运行。
内容的提问来源于stack exchange,提问作者Lalit Chattar
相关产品推荐
相关产品推荐

