Вы могли бы сделать это так:
../node[not(text()) and preceding-sibling::node[@id][1][@id='1']]
где '1'
- идентификатор текущего узла (сгенерировать выражение динамически).
Выражение говорит:
- из текущего контекста перейти к родителю
- выберите те дочерние узлы, которые
- не имеет текста и
- из всех «предыдущих узлов-братьев, имеющих идентификатор», первый должен иметь идентификатор 1
Если вы находитесь в XSLT, вы можете выбрать одну из следующих родственных осей, поскольку вы можете использовать функцию current()
:
<!-- the for-each is merely to switch the current node -->
<xsl:for-each select="node[@id='1']">
<xsl:copy-of select="
following-sibling::node[
not(text()) and
generate-id(preceding-sibling::node[@id][1])
=
generate-id(current())
]
" />
</xsl:for-each>
или проще (и эффективнее) с ключом:
<xsl:key
name="kNode"
match="node[not(text())]"
use="generate-id(preceding-sibling::node[@id][1])"
/>
<xsl:copy-of select="key('kNode', generate-id(node[@id='1']))" />