使用xsl:key提取元素的XSLT 3问题及优化咨询
用XSLT的xsl:key高效筛选dmCode元素的方案
一、解决初始筛选问题(@infoCode='141'、@infoCodeVariant='A'、@disassyCodeVariant以'A'开头)
你之前用key出错,大概率是因为key的键只包含了部分筛选条件,导致无法精确匹配所有规则。要实现精准筛选,需要把所有筛选维度组合成key的键值:
- 定义组合键
<xsl:key name="dmCodeKey" match="dmCode" use="concat(@infoCode, '|', @infoCodeVariant, '|', substring(@disassyCodeVariant, 1, 1))"/>
这里用|作为分隔符,把@infoCode、@infoCodeVariant,以及@disassyCodeVariant的首字符拼接成唯一键,确保只有同时满足三个条件的元素才会被映射到同一个键下。
- 调用key获取筛选结果
<xsl:variable name="targetDmCodes" select="key('dmCodeKey', '141|A|A')"/>
这样返回的就是完全符合所有条件的dmCode元素,不会再出现@infoCode≠141的结果。
二、增加@disassyCode条件后的key方案
如果需要额外匹配@disassyCode的特定值,只需要把这个属性也加入到组合键中:
- 扩展key定义
<xsl:key name="dmCodeExtendedKey" match="dmCode" use="concat(@infoCode, '|', @infoCodeVariant, '|', substring(@disassyCodeVariant, 1, 1), '|', @disassyCode)"/>
如果@disassyCode可能为空值,为了避免键值出现无效分隔符,可以优化为:
<xsl:key name="dmCodeExtendedKey" match="dmCode" use="concat(@infoCode, '|', @infoCodeVariant, '|', substring(@disassyCodeVariant, 1, 1), '|', if (@disassyCode) then @disassyCode else '')"/>
- 调用扩展后的key
比如要匹配@disassyCode='D01'的情况:
<xsl:variable name="extendedTargetDmCodes" select="key('dmCodeExtendedKey', '141|A|A|D01')"/>
关键说明
用组合键的核心逻辑是:把所有需要精确匹配的条件(包括前缀这类可提取的特征)拼接成唯一键,让key索引直接定位到符合所有规则的元素。这种方式比每次用复杂XPath遍历筛选效率高得多,尤其在处理大型XML文档时优势明显。
内容的提问来源于stack exchange,提问作者Caroline
相关产品推荐
相关产品推荐

