Вот полное преобразование:
<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="/*">
<new>
<xsl:apply-templates select=
"*[. = 'Emma']/following-sibling::*"/>
</new>
</xsl:template>
<xsl:template match="*/*">
<one><xsl:value-of select="."/></one>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML :
<name>
<a>Andy</a>
<b>Emma</b>
<c>John</c>
<d>Cindy</d>
<e>May</e>
</name>
желаемый, правильный результат получается :
<new>
<one>John</one>
<one>Cindy</one>
<one>May</one>
</new>
Другим вариантом является использование следующего шаблона совпадения :
*/*[not('Emma' = .|following-sibling::*)]
И полное преобразование теперь :
<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="/*">
<new>
<xsl:apply-templates/>
</new>
</xsl:template>
<xsl:template match="*/*[not('Emma' = .|following-sibling::*)]">
<one><xsl:value-of select="."/></one>
</xsl:template>
<xsl:template match="*/*" priority="0"/>
</xsl:stylesheet>