如何在未知父级的元素序列中获取后续同级元素?
XSLT中孤立元素序列的后续元素获取方案
问题本质
你观察得没错:following-sibling轴依赖节点在树结构中的父节点关系——只有共享同一父节点的元素,才能通过该轴找到同级后续节点。而直接定义的element()*类型序列里的元素是孤立节点(无父节点),不属于任何树结构,因此该轴无法生效。
无需创建新文档的解决方案
不用把元素塞进新文档,直接利用XSLT的序列操作能力就能实现需求:
1. 已知目标元素在序列中的位置
如果明确要找序列中第N个元素之后的所有元素,直接通过位置筛选:
<xsl:variable name="foos" as="element()*"> <foo1/> <foo2/> <foo3/> </xsl:variable> <!-- 获取第2个元素之后的所有元素(即foo3) --> <xsl:variable name="following-elements" select="$foos[position() > 2]"/>
2. 未知目标元素位置,需动态查找
如果目标元素是序列中的任意元素(不确定它的位置),用index-of定位它的位置,再用subsequence截取后续部分:
<xsl:variable name="foos" as="element()*"> <foo1/> <foo2/> <foo3/> </xsl:variable> <xsl:variable name="target-element" select="$foos[2]"/> <!-- 获取目标元素在序列中的第一个匹配位置 --> <xsl:variable name="target-pos" select="index-of($foos, $target-element)[1]"/> <!-- 截取从目标位置+1开始的所有元素 --> <xsl:variable name="following-elements" select="subsequence($foos, $target-pos + 1)"/>
注:如果序列中有重复的元素节点,
index-of会返回所有匹配的位置,[1]确保取第一个匹配项的位置。
3. XSLT 3.0简化写法(若使用3.0版本)
如果只需要获取序列中某个元素之后的所有元素,也可以结合skip操作:
<xsl:variable name="following-elements" select="$foos => skip($target-pos)"/>
这里的skip($n)会跳过序列的前n个元素,效果和subsequence($foos, $n+1)一致。
内容的提问来源于stack exchange,提问作者MrD at KookerellaLtd
相关产品推荐
相关产品推荐

