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

嵌套xsl:for-each性能优化:关联Node_1与Node_2生成XML

优化XSLT处理大量重复节点的性能问题

嘿,我注意到你当前用嵌套<xsl:for-each>加<xsl:if>的方式匹配Line值,当Node_1和Node_2超过100个时性能拉胯——这是因为这种写法是**O(n²)**的时间复杂度,每处理一个Node_1就要把所有Node_2遍历一遍,节点越多越慢。

咱们换用XSLT的**键(key)**来做索引,把查找时间降到O(1),整体性能直接提升一个档次!

优化后的XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 给Node_2建立索引,以Line值为匹配键 -->
    <xsl:key name="node2-by-line" match="Node_2" use="Line"/>

    <xsl:template match="/">
        <root> <!-- 可根据实际需求调整根节点名称 -->
            <xsl:for-each select="Node/Node_1">
                <newnode1> <!-- 对应需求中的目标节点newnode1 -->
                    <line><xsl:value-of select="Line"/></line>
                    <text><xsl:value-of select="Text"/></text>
                    <desc><xsl:value-of select="Desc"/></desc>
                    <cust><xsl:value-of select="Cust"/></cust>
                    <!-- 通过索引直接定位匹配Line的Node_2,无需全量遍历 -->
                    <xsl:for-each select="key('node2-by-line', Line)">
                        <readind><xsl:value-of select="ReadInd"/></readind>
                        <writeind><xsl:value-of select="WriteInd"/></writeind>
                        <updateind><xsl:value-of select="UpdateInd"/></updateind>
                    </xsl:for-each>
                </newnode1>
            </xsl:for-each>
        </root>
    </xsl:template>
</xsl:stylesheet>

关键优化点说明

  1. 索引建立:
    <xsl:key name="node2-by-line" match="Node_2" use="Line"/> 会提前把所有Node_2节点按Line值分组存储,相当于给Node_2建了个“快速查找表”。

  2. 高效查找:
    处理每个Node_1时,用key('node2-by-line', Line)就能直接定位到所有Line值匹配的Node_2,不用再遍历全部Node_2,时间复杂度直接从O(n²)降到O(n)。

  3. 修复原代码的小bug:
    原代码里<xsl:variable name="line" select="//Node_1/Line"/>是错的——它会选中所有Node_1的Line值,而不是当前遍历的那个Node_1的Line。优化后的代码直接用Line(上下文就是当前Node_1),避免了变量误用。

输入输出示例

简化版输入XML

<?xml version="1.0" encoding="UTF-8"?>
<Node>
    <Node_1>
        <Line>1</Line>
        <Text>First node1</Text>
        <Desc>Desc1</Desc>
        <Cust>Cust1</Cust>
    </Node_1>
    <Node_2>
        <Line>1</Line>
        <ReadInd>Y</ReadInd>
        <WriteInd>Y</WriteInd>
        <UpdateInd>Y</UpdateInd>
    </Node_2>
</Node>

输出XML

<root>
    <newnode1>
        <line>1</line>
        <text>First node1</text>
        <desc>Desc1</desc>
        <cust>Cust1</cust>
        <readind>Y</readind>
        <writeind>Y</writeind>
        <updateind>Y</updateind>
    </newnode1>
</root>

这种方案在节点数量较多(比如几百上千个)时,性能提升会非常显著,完全解决你遇到的性能问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:20:53