Вам не хватает функции current()
.
<xsl:for-each select="/Root/CustomerOrder/Drinks/Drink">
<xsl:sort select="/Root/DrinkSelections/Drink[@id = current()/@oid]/@name"/>
<xsl:value-of select="/Root/DrinkSelections/Drink[@id = current()/@oid]/@name"/>
</xsl:for-each>
Но, что более важно, вам не хватает XSL-ключей для удобства чтения и производительность:
<xsl:key name="kDrinkById" match="DrinkSelections/Drink" use="@id" />
<!-- ... later ... -->
<xsl:for-each select="/Root/CustomerOrder/Drinks/Drink">
<xsl:sort select="key('kDrinkById', @oid)/@name"/>
<xsl:value-of select="key('kDrinkById', @oid)/@name"/>
</xsl:for-each>
А вы, вероятно, не используете шаблоны правильно, потому что если вы это сделали, ваше xsl:for-each
выражение выбора не будет начинаться с корня.
<xsl:template match="Root">
<xsl:apply-templates select="CustomerOrder/Drinks" />
</xsl:template>
<xsl:template match="CustomerOrder/Drinks">
<xsl:apply-templates select="Drink">
<xsl:sort select="key('kDrinkById', @oid)/@name"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="CustomerOrder/Drinks/Drink">
<xsl:value-of select="key('kDrinkById', @oid)/@name"/>
</xsl:template>
Обратите внимание, что я также убрал for-each. Каждый исключенный xsl:for-each
является шагом к лучшему XSLT-коду (применяются очень редкие исключения).