XSLT 1.0中xsl:key匹配含Formatted的Alarm节点为何返回空?
XSLT 1.0中xsl:key无法匹配目标节点的问题分析及解决
问题场景
需要处理的XML结构如下:
<Root> <Alarm> <Name>short</Name> <FlagValues>Client, RunTime, Language</FlagValues> </Alarm> <Alarm> <Name>long</Name> <FlagValues>Client, Formatted, RunTime, Language</FlagValues> </Alarm> </Root>
需求是用xsl:key创建映射,筛选出所有FlagValues包含"Formatted"的Alarm节点,以Name作为键。
错误代码及问题点
原尝试的xsl:key定义:
<xsl:key name="alarmNodes" match="Root/Alarm/FlagValues[contains(text(), 'Formatted')]" use="Name" />
访问代码:
<xsl:when test="key('alarmNodes', "'long'")">
执行后返回空结果,问题出在三处:
- match节点定位错误:当前匹配的是
FlagValues节点,但需求是要获取Alarm节点,应该将match目标设为Alarm,再通过谓词过滤其下FlagValues包含指定字符串的节点。 - use属性路径错误:当
match的是FlagValues时,Name是其父节点Alarm的子节点,此时use="Name"无法正确引用;若直接匹配Alarm节点,use="Name"就能直接引用当前Alarm下的Name节点值。 - key访问参数引号错误:访问
key时传入的"'long'"多了一层嵌套引号,应该直接写'long'或者"long"。
正确实现代码
正确的xsl:key定义
<xsl:key name="alarmNodes" match="Root/Alarm[contains(FlagValues, 'Formatted')]" use="Name" />
正确的访问方式
<xsl:when test="key('alarmNodes', 'long')">
执行后可正确获取目标Alarm节点:
<Alarm> <Name>long</Name> <FlagValues>Client, Formatted, RunTime, Language</FlagValues> </Alarm>
内容的提问来源于stack exchange,提问作者Marcus1807
相关产品推荐
相关产品推荐

