如何使用XSLT规范化/转换员工技能XML数据?
XSLT员工技能XML数据转换方案
需求概述
- 按员工ID升序排列技能,所有技能(最多20个)需关联对应员工ID
- 若技能名称前20个字符相同,视为同一技能
- 输出样式需匹配以下参考截图:

输入XML示例
<wd:Report_Data xmlns:wd="urn:com.workday.report/Worker_Skills_Data"> <wd:Report_Entry> <wd:empid>100006949</wd:empid> <wd:name>Brooke</wd:name> <wd:status>Active</wd:status> <wd:skillscloud> <wd:skill>Assisting First Time Home Buyers</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Banking</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Credit</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Leadership</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Lending</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Loan Origination</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Mortgage Banking</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Mortgage Lending</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Negotiation</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Real Estate</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Real Estate Investments</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Refinancing</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Residential Homes</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Residential Mortgages</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Reverse Mortgages</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Sales</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Sales Management</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>VA Lending</wd:skill> </wd:skillscloud> </wd:Report_Entry> <wd:Report_Entry> <wd:empid>100002194</wd:empid> <wd:name>Troy</wd:name> <wd:status>Active</wd:status> <wd:skillscloud> <wd:skill>Banking</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Credit</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Credit Analysis</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Customer Service</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Finance</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Financial Analysis</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Leadership</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Lending</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Loan Servicing</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Mortgage Banking</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Mortgage Lending</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Mortgage Servicing</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>People Management</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Process Improvements</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Risk Management</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Software Documentation</wd:skill> </wd:skillscloud> <wd:skillscloud> <wd:skill>Underwriting</wd:skill> </wd:skillscloud> </wd:Report_Entry> </wd:Report_Data>
XSLT转换代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="urn:com.workday.report/Worker_Skills_Data"> <xsl:output method="html" indent="yes"/> <!-- 按员工ID升序排序员工并生成表格 --> <xsl:template match="/wd:Report_Data"> <html> <body> <table border="1"> <tr> <th>员工ID</th> <th>员工姓名</th> <th>技能</th> </tr> <!-- 按empid数值升序排列员工条目 --> <xsl:for-each select="wd:Report_Entry"> <xsl:sort select="wd:empid" data-type="number" order="ascending"/> <tr> <td><xsl:value-of select="wd:empid"/></td> <td><xsl:value-of select="wd:name"/></td> <td> <!-- 去重技能(前20字符相同视为同一技能),最多显示20个 --> <xsl:for-each select="wd:skillscloud[not(substring(wd:skill,1,20) = preceding-sibling::wd:skillscloud/substring(wd:skill,1,20))]"> <xsl:if test="position() <= 20"> <p><xsl:value-of select="wd:skill"/></p> </xsl:if> </xsl:for-each> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
关键逻辑说明
- 员工排序:通过
<xsl:sort>按员工ID的数值类型升序排列所有员工条目 - 技能去重:截取技能名称前20字符,对比当前技能与前序技能的截取值,过滤重复技能
- 数量限制:使用
position() <= 20确保每个员工最多展示20个技能 - 输出结构:生成HTML表格,匹配参考截图的列布局与展示形式
内容的提问来源于stack exchange,提问作者Buddi
相关产品推荐
相关产品推荐

