如何从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
相关产品推荐
相关产品推荐

