XSLT合并节点去重是否可行?如何提取唯一EMPLOYEE_ID生成指定文件
解决方案
问题1:XSLT合并节点并去重是否可行?
完全可行。XSLT提供了多种机制实现节点合并与去重,具体实现方式取决于你使用的XSLT版本(1.0 vs 2.0+)。
问题2:获取唯一EMPLOYEE_ID并执行循环处理
下面分两种主流XSLT版本给出具体实现方案:
方案1:XSLT 2.0及以上(推荐,语法更简洁)
XSLT 2.0+支持distinct-values()函数直接提取唯一值,还支持序列(可看作你说的“数组”),同时可以通过xsl:for-each或xsl:for-each-group遍历处理。
完整XSLT代码
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <!-- 获取所有唯一的EMPLOYEE_ID值 --> <xsl:variable name="unique-ids" select="distinct-values(root/*/EMPLOYEE_ID)"/> <xsl:template match="/"> <!-- 遍历每个唯一ID --> <xsl:for-each select="$unique-ids"> <xsl:variable name="current-id" select="."/> <!-- 遍历所有包含该ID的G节点(G1/G2/G3) --> <xsl:for-each select="/root/*[EMPLOYEE_ID = $current-id]"> <!-- 输出格式:节点名|ID|换行 --> <xsl:value-of select="local-name(), $current-id, ''" separator="|"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:for-each> </xsl:template> </xsl:stylesheet>
代码说明
distinct-values(root/*/EMPLOYEE_ID):提取所有G1/G2/G3下的EMPLOYEE_ID的唯一值,返回一个序列(类似数组)。- 外层循环遍历每个唯一ID,内层循环找到所有包含该ID的G节点。
local-name()获取当前G节点的名称(G1/G2/G3),separator="|"自动用竖线分隔输出项,最后加换行符 。
方案2:XSLT 1.0(兼容旧版处理器)
XSLT 1.0没有原生的唯一值函数,需要用Muenchian分组法实现去重。
完整XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <!-- 定义分组键:EMPLOYEE_ID的值 --> <xsl:key name="id-group" match="*/EMPLOYEE_ID" use="."/> <xsl:template match="/"> <!-- 遍历所有唯一的EMPLOYEE_ID节点(分组后的第一个节点) --> <xsl:for-each select="/root/*/EMPLOYEE_ID[generate-id() = generate-id(key('id-group', .)[1])]"> <xsl:variable name="current-id" select="."/> <!-- 遍历所有包含该ID的G节点 --> <xsl:for-each select="/root/*[EMPLOYEE_ID = $current-id]"> <xsl:text>G</xsl:text> <xsl:value-of select="substring-after(local-name(), 'G'), $current-id" separator="|"/> <xsl:text>| </xsl:text> </xsl:for-each> </xsl:for-each> </xsl:template> </xsl:stylesheet>
代码说明
<xsl:key>定义分组规则:以EMPLOYEE_ID的值为键,匹配所有G节点下的EMPLOYEE_ID。generate-id() = generate-id(key('id-group', .)[1]):筛选出每个分组的第一个节点,实现去重。- 内层循环找到所有包含当前ID的G节点,拼接节点名、ID和竖线,最后加换行。
输出结果
两种方案都会生成你需要的平面文件内容:
G1|1| G2|1| G3|1| G1|2| G2|3|
内容的提问来源于stack exchange,提问作者user1883094
相关产品推荐
相关产品推荐

