You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向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>&#10;</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>&#10;</xsl:text>
        </xsl:for-each>
        
        <xsl:text disable-output-escaping="yes">]]></xsl:text>
      </result>
    </Response>
  </xsl:template>
</xsl:stylesheet>

额外补充

  1. 外部语言传参:如果你的List/Map是从Java、C#等外部语言传入XSLT的,需要先把集合转换成XML结构(比如Java可以生成DOM节点集合,通过Transformer.setParameter()传入;C#用XsltArgumentList传递可枚举节点)。
  2. CDATA的必要性:如果你的输出不需要强制用CDATA包裹,完全可以去掉disable-output-escaping相关代码,XSLT会自动处理XML特殊字符的转义。

内容的提问来源于stack exchange,提问作者user3520080

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:36:07