如何调整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
相关产品推荐
相关产品推荐

