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

使用XSL统计XML元素时following-sibling计数异常问题求解

未加[1]限定出现匹配错误的原因

Apple plist格式的dict节点遵循「<key>键名</key> + 值节点」的配对规则,键和对应的值为平级兄弟节点,按顺序一一对应,不存在嵌套包含关系。
following-sibling::dict不加谓词时,会选中当前主key节点之后所有同级的dict节点,包含其他主key对应的dict节点。后续查找EntryCollectionB节点时,会遍历所有命中的dict,把多个主key下的符合条件的子key全部累加计数,最终结果和预期不符。
添加[1]谓词后,限定只取当前主key之后第一个同级dict节点,这个节点就是和当前主key直接配对的专属值节点,不会跨到其他主key的范围,因此计数结果正确。

这类plist层级节点统计的正确XPath实现方式

方案1:兄弟节点位置限定(最简方案)

在你已有的修改基础上,可以给EntryCollectionB对应的后续dict也加上[1]限定,进一步避免极端场景下的误匹配,性能最优,适合plist结构严格符合Apple官方规范的场景:

count(following-sibling::dict[1]/key[text()='EntryCollectionB']/following-sibling::dict[1]/key)

方案2:键值配对通用方案(高稳定性)

如果plist结构复杂、或者存在节点顺序变动的可能,可以用XSLT的key机制实现键和值的绑定,完全不依赖兄弟节点的位置顺序:

  1. 首先在xsl:stylesheet节点下定义配对规则:
<xsl:key name="plKeyValue" match="*[not(self::key)]" use="generate-id(preceding-sibling::key[1])"/>
  1. 统计时直接按id匹配对应值节点即可:
<!-- 获取当前主key对应的dict值节点 -->
<xsl:variable name="mainDict" select="key('plKeyValue', generate-id(.))"/>
<!-- 获取EntryCollectionB对应的dict值节点 -->
<xsl:variable name="entryBDict" select="key('plKeyValue', generate-id($mainDict/key[text()='EntryCollectionB']))"/>
<!-- 统计子key数量,EntryCollectionB不存在时默认返回0 -->
<xsl:value-of select="count($entryBDict/key)"/>

内容的提问来源于stack exchange,提问作者T. Bug Reporter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:54:05