You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>&#10;</xsl:text>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

代码说明

  1. distinct-values(root/*/EMPLOYEE_ID):提取所有G1/G2/G3下的EMPLOYEE_ID的唯一值,返回一个序列(类似数组)。
  2. 外层循环遍历每个唯一ID,内层循环找到所有包含该ID的G节点。
  3. local-name()获取当前G节点的名称(G1/G2/G3),separator="|"自动用竖线分隔输出项,最后加换行符&#10;。

方案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>|&#10;</xsl:text>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

代码说明

  1. <xsl:key>定义分组规则:以EMPLOYEE_ID的值为键,匹配所有G节点下的EMPLOYEE_ID。
  2. generate-id() = generate-id(key('id-group', .)[1]):筛选出每个分组的第一个节点,实现去重。
  3. 内层循环找到所有包含当前ID的G节点,拼接节点名、ID和竖线,最后加换行。

输出结果

两种方案都会生成你需要的平面文件内容:

G1|1|
G2|1|
G3|1|
G1|2|
G2|3|

内容的提问来源于stack exchange,提问作者user1883094

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:41:44