嵌套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>
关键优化点说明
索引建立:
<xsl:key name="node2-by-line" match="Node_2" use="Line"/>会提前把所有Node_2节点按Line值分组存储,相当于给Node_2建了个“快速查找表”。高效查找:
处理每个Node_1时,用key('node2-by-line', Line)就能直接定位到所有Line值匹配的Node_2,不用再遍历全部Node_2,时间复杂度直接从O(n²)降到O(n)。修复原代码的小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
相关产品推荐
相关产品推荐

