如何选择包含指定字符串节点的最近带@isDoc属性的祖先节点?
解决XSLT选择最近带指定属性的祖先节点问题
要精准选中包含目标节点的最近且带有@isDoc属性的祖先节点,核心是利用XPath的轴排序特性,在筛选条件后加上索引[1]即可。
核心XPath表达式
假设目标节点是包含指定标识(比如macro[@alias=$macroAlias])的节点,对应的XPath为:
//macro[@alias=$macroAlias]/ancestor::*[@isDoc][1]
原理说明
ancestor::*轴会返回当前节点的所有祖先节点,顺序是从最近的父节点开始,向上遍历到根节点。- 加上
[@isDoc]筛选出带指定属性的祖先,再通过[1]取排序后的第一个节点,也就是距离目标节点最近的符合条件的祖先。
示例验证
假设你的XML结构如下:
<root isDoc="true"> <section isDoc="true"> <example isDoc="true"> <macro alias="match">匹配内容</macro> </example> </section> </root>
当$macroAlias值为match时,使用上述XPath会精准选中<example isDoc="true">节点,而非上层的<section>或<root>。
模板内使用示例
如果是在匹配目标节点的模板中,直接引用当前节点的祖先:
<xsl:template match="macro[@alias=$macroAlias]"> <xsl:copy-of select="ancestor::*[@isDoc][1]"/> </xsl:template>
内容的提问来源于stack exchange,提问作者ProNotion
相关产品推荐
相关产品推荐

