Использование :
/*/*[(.|preceding-sibling::*)[contains(text(),'world')]]
Это выражение XPath, вероятно, является самым коротким, которое выбирает именно нужный набор элементов.
Проверка на основе XSLT :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/*[(.|preceding-sibling::*)[contains(.,'world')]]"/>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к предоставленному XML-документу :
<options>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>hello world</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
</options>
желаемый, правильный результат получается :
<option>hello world</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
<option>something</option>
В качестве альтернативы вы можете получить это преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="*[(.|preceding-sibling::*)[contains(text(),'world')]]">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>