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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:27:25