Это можно сделать с помощью одного выражения XPath, как указано в ответе гизмо.
Поскольку вопрос специально для XSLT, вот эффективное решение XSLT с использованием ключей:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<!-- -->
<xsl:key name="kAByBTypeVal"
match="a"
use="concat(b/@type,'+',b/@value)"/>
<!-- -->
<xsl:template match="/">
<xsl:copy-of select=
"key('kAByBTypeVal', 'bar+12')"/>
</xsl:template>
</xsl:stylesheet>
Когда вышеуказанное преобразование применяется к этому документу XML :
<t>
<a id="123">
<b type="foo" value="1" />
<b type="baz" value="1" />
</a>
<a id="789">
<b type="bar" value="12" />
</a>
<a id="999">
<b type="foo" value="2" />
</a>
</t>
получен правильный результат :
<a id="789">
<b type="bar" value="12"/>
</a>