如何向XSLT传递List/Map并循环遍历输出其中XML值?
当然可以实现这个需求!不过你当前的代码还没法处理动态大小的集合,我来帮你调整并解释清楚~
首先要明确:XSLT 1.0本身没有原生的List/Map数据类型,但我们可以通过结构化的XML输入来模拟这种动态集合——不管是List还是Map,只要把它们转换成XML节点的形式传入XSLT,就能用循环遍历处理。
核心问题分析
你当前的代码里硬编码了firstValueInMap这类固定节点,这只能处理固定数量的元素,没法适配大小不固定的集合。我们需要用<xsl:for-each>或者模板匹配来实现动态循环。
场景1:处理动态List(节点列表)
假设你传入的List被转换成了如下XML结构(每个元素对应一个<value>节点):
<Root> <values> <value><user><id>1</id><name>张三</name></user></value> <value><product><id>100</id><price>99</price></product></value> <!-- 可以有任意多个value节点 --> </values> </Root>
对应的XSLT代码(循环遍历所有<value>节点并输出内容):
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <Response> <result type="xsd:string"> <!-- 可选:用CDATA包裹输出内容,如果不需要可以去掉这两行和中间的disable-output-escaping --> <xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text> <!-- 循环遍历所有value节点 --> <xsl:for-each select="Root/values/value"> <!-- 复制当前节点的全部内容(包括子节点) --> <xsl:copy-of select="."/> <!-- 可选:添加换行分隔每个元素 --> <xsl:text> </xsl:text> </xsl:for-each> <xsl:text disable-output-escaping="yes">]]></xsl:text> </result> </Response> </xsl:template> </xsl:stylesheet>
场景2:处理动态Map(键值对集合)
如果是Map,可以转换成带key属性的<entry>节点结构:
<Root> <map> <entry key="userInfo"><user><id>1</id><name>张三</name></user></entry> <entry key="productDetail"><product><id>100</id><price>99</price></product></entry> <!-- 可以有任意多个entry节点 --> </map> </Root>
对应的XSLT代码(遍历键值对,同时输出键和值):
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <Response> <result type="xsd:string"> <xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text> <!-- 循环遍历所有entry节点 --> <xsl:for-each select="Root/map/entry"> <!-- 输出键 --> <xsl:text>键: </xsl:text> <xsl:value-of select="@key"/> <xsl:text> - 值: </xsl:text> <!-- 复制值的内容 --> <xsl:copy-of select="*"/> <xsl:text> </xsl:text> </xsl:for-each> <xsl:text disable-output-escaping="yes">]]></xsl:text> </result> </Response> </xsl:template> </xsl:stylesheet>
额外补充
- 外部语言传参:如果你的List/Map是从Java、C#等外部语言传入XSLT的,需要先把集合转换成XML结构(比如Java可以生成DOM节点集合,通过
Transformer.setParameter()传入;C#用XsltArgumentList传递可枚举节点)。 - CDATA的必要性:如果你的输出不需要强制用CDATA包裹,完全可以去掉
disable-output-escaping相关代码,XSLT会自动处理XML特殊字符的转义。
内容的提问来源于stack exchange,提问作者user3520080
相关产品推荐
相关产品推荐

