В настоящее время я нахожусь на <A>
и хочу применить шаблон к элементу, чей @rename="yes"
предшествует элементу <F>
Вы хотите этот XPathВыражение (при условии, что A
имеет только одного следующего родного брата с именем F
):
following-sibling::F/preceding-sibling::*[@rename='yes'][1]
Выбирает любой элемент, атрибут rename
которого имеет значение "yes"
, и это первый такойпредшествующий элемент любого следующего элемента (текущего узла) с именем F
.
Вот полное преобразование XSLT :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="A">
<xsl:apply-templates mode="found" select=
"following-sibling::F/preceding-sibling::*[@rename='yes'][1]"/>
</xsl:template>
<xsl:template match="*" mode="found">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
, когдаприменяется к предоставленному документу XML :
<Root>
<A rename="yes"/>
<B rename="no"/>
<C rename="no"/>
<D rename="yes"/>
<E rename="no"/>
<F all="yes"/>
</Root>
желаемый, правильный результат получается :
<D rename="yes"/>