如何通过带条件的XSLT映射从XML不同节点提取指定Manager详情
方案1:使用XSLT实现
以下是满足需求的XSLT样式表,可筛选出上级Company值为001的Person对应的Manager信息,生成指定结构的输出XML:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <!-- 匹配根节点,构建输出结构 --> <xsl:template match="/"> <Managers> <!-- 遍历并筛选company属性为001的Company节点 --> <xsl:for-each select="Root/Company[@company='001']"> <Manager> <!-- 复制Manager节点下的company和cost_center字段 --> <xsl:copy-of select="Manager/company"/> <xsl:copy-of select="Manager/cost_center"/> </Manager> </xsl:for-each> </Managers> </xsl:template> <!-- 忽略无关节点和文本 --> <xsl:template match="text()|@*"/> </xsl:stylesheet>
适配说明:
- 假设输入XML结构为
Root节点下包含多个Company节点,Company节点通过company属性标识编号,内部包含Person和Manager子节点; - 若输入XML中
company是子节点而非属性,将select="Root/Company[@company='001']"修改为select="Root/Company[company='001']"即可。
方案2:使用Groovy脚本实现
以下Groovy脚本可读取输入XML、筛选目标数据并生成指定结构的输出XML:
import groovy.xml.XmlSlurper import groovy.xml.MarkupBuilder // 示例输入XML,实际可替换为文件路径读取 def inputXml = ''' <Root> <Company company="001"> <Person>John Doe</Person> <Manager> <company>001</company> <cost_center>CC_001</cost_center> </Manager> </Company> <Company company="002"> <Person>Jane Smith</Person> <Manager> <company>002</company> <cost_center>CC_002</cost_center> </Manager> </Company> </Root> ''' // 解析输入XML def root = new XmlSlurper().parseText(inputXml) // 构建输出XML def writer = new StringWriter() def xmlBuilder = new MarkupBuilder(writer) xmlBuilder.setDoubleQuotes(true) xmlBuilder.Managers { // 筛选上级company为001的Manager root.Company.findAll { it.@company == '001' }.each { companyNode -> Manager { company(companyNode.Manager.company.text()) cost_center(companyNode.Manager.cost_center.text()) } } } // 输出结果(可替换为写入文件) println writer.toString()
适配说明:
- 若需读取本地XML文件,将
inputXml替换为new File('你的输入文件路径').text; - 若输入XML中
company是子节点,将it.@company == '001'修改为it.company.text() == '001'即可。
内容的提问来源于stack exchange,提问作者vamsi krishna
相关产品推荐
相关产品推荐

