如何用XSLT 2.0按拆分的日期列重复输出同一行数据
XSLT 2.0 拆分员工日期记录解决方案
首先假设你的原始XML结构如下(如果实际结构不同,只需调整XPath路径即可):
<employees> <employee> <EmpNo>123</EmpNo> <name>abc</name> <enrollingDates>10/01/2022-10/02/2022-10/05/2022</enrollingDates> </employee> </employees>
对应的XSLT 2.0转换代码如下:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <!-- 输出表头 --> <xsl:template match="/"> <xsl:text>EmpNo Name enrollingDates </xsl:text> <xsl:apply-templates select="employees/employee"/> </xsl:template> <!-- 处理每个员工节点 --> <xsl:template match="employee"> <!-- 使用tokenize拆分日期字符串,分隔符为'-' --> <xsl:variable name="dates" select="tokenize(enrollingDates, '-')"/> <xsl:variable name="empNo" select="EmpNo"/> <!-- 把姓名转成大写 --> <xsl:variable name="upperName" select="upper-case(name)"/> <!-- 遍历每个拆分后的日期,输出一行记录 --> <xsl:for-each select="$dates"> <xsl:value-of select="$empNo"/> <xsl:text> </xsl:text> <xsl:value-of select="$upperName"/> <xsl:text> </xsl:text> <xsl:value-of select="."/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
关键说明
tokenize(enrollingDates, '-'):XSLT2.0新增的字符串拆分函数,把用-分隔的日期串拆分成节点序列,每个日期是一个独立节点。upper-case(name):将姓名转换为大写,匹配你期望的输出格式。xsl:output method="text":指定输出为纯文本格式,而非XML,符合你要的单行记录样式。 :代表换行符,确保每个日期对应一行独立记录。
转换后的输出结果:
EmpNo Name enrollingDates 123 ABC 10/01/2022 123 ABC 10/02/2022 123 ABC 10/05/2022
内容的提问来源于stack exchange,提问作者Rabit2
相关产品推荐
相关产品推荐

