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

如何调整XSLT的xsl:key,排除下一个name以T:开头的member节点

解决XSLT Key分组时排除后续T:开头节点的问题

嘿,这个问题我太懂了!你之前的key之所以会把下一个T:开头的节点也包含进来,是因为那个节点本身的preceding-sibling::*[contains(@name, 'T:')][1]指向的就是前一个T:节点,所以它会被错误归到前一组里。咱们只需要微调一下key的匹配条件,把本身就是T:开头的节点排除在外就行啦!

修改后的XSLT Key定义

<xsl:key name="subMembers" match="member[not(starts-with(@name, 'T:'))]" use="generate-id(preceding-sibling::member[starts-with(@name, 'T:')][1])" />

关键调整细节:

  • 把match="member"改成match="member[not(starts-with(@name, 'T:'))]":直接过滤掉所有T:开头的节点,确保分组里只包含非T:类型的成员。
  • 把contains(@name, 'T:')换成starts-with(@name, 'T:'):比contains更精准,避免匹配到名字中间意外包含T:的节点(比如F:XXX_T:YYY这种边缘情况)。

实际使用示例

如果你要遍历每个T:开头的节点,并输出它对应的后续子成员,可以这么写:

<xsl:template match="/">
  <xsl:for-each select="doc/members/member[starts-with(@name, 'T:')]">
    <group>
      <group-title><xsl:value-of select="@name" /></group-title>
      <!-- 获取当前T:节点对应的所有后续子成员(直到下一个T:节点为止) -->
      <xsl:copy-of select="key('subMembers', generate-id(.))" />
    </group>
  </xsl:for-each>
</xsl:template>

这样处理后,每个T:节点对应的组里就只会包含它之后、下一个T:节点之前的所有非T:节点,完全符合你的需求!

内容的提问来源于stack exchange,提问作者Mica

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:02:49