使用XSL对带field name属性的XML记录进行分组
我来帮你搞定这个从Taleo导出XML中提取指定字段并生成分组XML的需求~
从Taleo XML中提取字段并生成分组XML的实现方案
核心思路
你已经明确了通过field元素的name属性定位字段的方式(比如select="field[@name='EmployeeEmployeeID']"),结合补充的Score字段,我们可以用XSLT来实现提取和分组的需求,这是处理XML结构转换最直接高效的方式。
具体步骤示例
1. 先明确目标提取字段
假设你需要提取的核心字段包括:
EmployeeEmployeeID(作为分组依据)Score(新增字段)- 其他业务字段(比如
EmployeeName、Department等,可按需添加)
2. 编写XSLT转换脚本
下面是一个基础的XSLT示例,会提取指定字段并按EmployeeEmployeeID完成分组(你可以根据实际分组需求调整规则):
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:taleo="http://www.taleo.com/ws/integration/toolkit/2005/07"> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <!-- 定义分组键:以EmployeeEmployeeID的值作为分组依据 --> <xsl:key name="employeeGroupKey" match="taleo:Record" use="taleo:field[@name='EmployeeEmployeeID']"/> <xsl:template match="/"> <GroupedEmployeeData> <!-- 遍历每个唯一的EmployeeEmployeeID分组 --> <xsl:for-each select="taleo:ExportXML/taleo:Record[count(. | key('employeeGroupKey', taleo:field[@name='EmployeeEmployeeID'])[1]) = 1]"> <EmployeeGroup> <EmployeeID> <xsl:value-of select="taleo:field[@name='EmployeeEmployeeID']"/> </EmployeeID> <!-- 提取当前分组下的Score字段 --> <xsl:for-each select="key('employeeGroupKey', taleo:field[@name='EmployeeEmployeeID'])/taleo:field[@name='Score']"> <ScoreValue> <xsl:value-of select="."/> </ScoreValue> </xsl:for-each> <!-- 可继续添加其他需要提取的字段 --> <EmployeeName> <xsl:value-of select="taleo:field[@name='EmployeeName']"/> </EmployeeName> </EmployeeGroup> </xsl:for-each> </GroupedEmployeeData> </xsl:template> </xsl:stylesheet>
3. 关键细节说明
- 原XML带有默认命名空间
http://www.taleo.com/ws/integration/toolkit/2005/07,所以XSLT中必须定义对应的命名空间前缀(比如示例中的taleo:),否则无法正确匹配XML元素。 - 如果你需要按其他字段分组,只需要修改
xsl:key的use属性,以及后续的分组选择逻辑即可。 - 输出XML的结构可以完全自定义,比如调整嵌套层级、字段标签名等,适配你的业务需求。
4. 执行转换的方式
你可以用任意支持XSLT的工具来执行转换:
- 命令行工具:比如Linux/macOS下的
xsltproc,Windows下的msxsl - 代码实现:比如Java的
TransformerFactory、Python的lxml库
举个Python用lxml执行转换的示例:
from lxml import etree # 加载输入XML和XSLT脚本 xml_input = etree.parse("your_taleo_export.xml") xslt_transform = etree.parse("your_transform.xsl") # 创建转换器并执行转换 transformer = etree.XSLT(xslt_transform) result_xml = transformer(xml_input) # 保存分组后的XML输出 with open("grouped_output.xml", "wb") as output_file: output_file.write(result_xml)
内容的提问来源于stack exchange,提问作者Ben Esteban
相关产品推荐
相关产品推荐

