如何用XSL将XML转换为垂直展示数据的CSV文件?
如何用XSL将XML转换为你期望的CSV格式
当然可以实现你想要的输出!你当前的XSL代码是把每个员工的所有经理都放在同一行,而我们需要为每个经理单独生成一行,和对应的员工配对。下面是具体的解决方案:
正确的XSL转换代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <xsl:template match="Root"> <!-- 遍历每一条员工记录 --> <xsl:for-each select="Row"> <!-- 把当前员工的名字存为变量,方便后续重复调用 --> <xsl:variable name="currentEmployee" select="Employee"/> <!-- 遍历当前行下所有经理节点(匹配以Employees_Manager_开头的节点) --> <xsl:for-each select="*[starts-with(local-name(), 'Employees_Manager_')]"> <!-- 输出员工名 --> <xsl:value-of select="$currentEmployee"/> <text>,</text> <!-- 输出当前经理的名字 --> <xsl:value-of select="."/> <text>,</text> <!-- 输出换行符,分隔每一行 --> <xsl:text>
</xsl:text> </xsl:for-each> </xsl:for-each> </xsl:template> </xsl:stylesheet>
为什么这个方案能工作?
- 变量复用:用
<xsl:variable>保存当前员工的名字,避免在每个经理循环里重复查询Employee节点,让代码更高效易懂。 - 动态匹配经理节点:通过
starts-with(local-name(), 'Employees_Manager_')匹配所有经理节点,就算以后新增Employees_Manager_4这类节点,代码也能自动适配,不用手动修改。 - 逐经理生成行:内层的
<xsl:for-each>会为每个经理单独生成一行数据,完美实现你需要的“员工-单个经理”的行结构。
转换后的输出结果
运行上述XSL后,你会得到完全符合期望的CSV:
Harry,Ron, Harry,Hermione, Harry,Ginni, Ross,Emma, Ross,Monica, Ross,Rachel,
内容的提问来源于stack exchange,提问作者Emma
相关产品推荐
相关产品推荐

