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

如何从LinkedHashMap生成指定XML?能否用XSLT或Groovy脚本实现?

解决方案:用Groovy或XSLT实现集合到XML的转换

完全可以用Groovy或XSLT实现这个需求,以下是两种方案的具体实现:

一、Groovy方案

Groovy对Java集合(包括LinkedHashMap)有原生支持,直接遍历集合并拼接XML即可,代码示例如下:

def filterMap = [
    Type: ['eq \'02\'', 'eq \'01\''],
    Value: ['eq \'22\''],
    Date: ['ge datetime\'2023-02-28T00:00:00\'', 'le datetime\'2023-03-01T00:00:00\'']
]

def xmlBuilder = new groovy.xml.MarkupBuilder()
xmlBuilder.filter {
    filterMap.each { key, conditions ->
        conditions.each { condition ->
            // 拆分操作符和右操作数
            def parts = condition.split(/\s+/)
            def operator = parts[0]
            def rightOperand = parts.size() > 1 ? parts[1].replaceAll(/['"]/, '') : ''
            
            // 处理datetime格式,去掉秒部分
            if (rightOperand.startsWith('datetime')) {
                rightOperand = rightOperand.replace('datetime', '').replaceAll(/:\d{2}$/, '')
            }
            
            expression {
                leftOperand(key)
                operator(operator)
                rightOperand(rightOperand)
            }
        }
    }
}

运行这段代码会直接输出符合要求的XML结构,Groovy的MarkupBuilder会自动处理缩进和标签闭合。

二、XSLT方案

XSLT需要先将LinkedHashMap序列化为XML格式(比如通过Java的XStream或Groovy的XmlBuilder先转成中间XML),再用XSLT转换为目标格式:

1. 中间XML输入(从LinkedHashMap序列化得到)

<map>
  <entry key="Type">
    <value>eq '02'</value>
    <value>eq '01'</value>
  </entry>
  <entry key="Value">
    <value>eq '22'</value>
  </entry>
  <entry key="Date">
    <value>ge datetime'2023-02-28T00:00:00'</value>
    <value>le datetime'2023-03-01T00:00:00'</value>
  </entry>
</map>

2. XSLT转换脚本

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <filter>
      <xsl:apply-templates select="map/entry/value"/>
    </filter>
  </xsl:template>

  <xsl:template match="value">
    <expression>
      <!-- 获取父节点的key作为leftOperand -->
      <leftOperand><xsl:value-of select="../@key"/></leftOperand>
      
      <!-- 提取操作符 -->
      <operator><xsl:value-of select="substring-before(., ' ')"/></operator>
      
      <!-- 提取并处理右操作数 -->
      <rightOperand>
        <xsl:variable name="rawValue" select="substring-after(., ' ')"/>
        <xsl:variable name="cleanValue" select="translate($rawValue, '''', '')"/>
        <xsl:choose>
          <xsl:when test="starts-with($cleanValue, 'datetime')">
            <xsl:value-of select="substring(substring-after($cleanValue, 'datetime'), 1, string-length(substring-after($cleanValue, 'datetime')) - 3)"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="$cleanValue"/>
          </xsl:otherwise>
        </xsl:choose>
      </rightOperand>
    </expression>
  </xsl:template>
</xsl:stylesheet>

将中间XML和XSLT脚本配合使用,即可生成目标XML结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:23:27