Это преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="vSortedNames">
<xsl:call-template name="sortedItemList"/>
</xsl:variable>
<xsl:template match="/*">
<xsl:text>product_name	price	remark</xsl:text>
<xsl:apply-templates select="*">
<xsl:sort select="price" data-type="number"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="product">
<xsl:value-of select=
"concat('
', item, '	', price, '	', $vSortedNames)"/>
</xsl:template>
<xsl:template name="sortedItemList">
<xsl:for-each select="/*/product">
<xsl:sort select="price" data-type="number"/>
<xsl:if test="not(position() = 1)">+</xsl:if>
<xsl:value-of select="item"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному XML-документу :
<products>
<product>
<item>Pen</item>
<price>10</price>
</product>
<product>
<item>Pencil</item>
<price>20</price>
</product>
<product>
<item>Bag</item>
<price>25</price>
</product>
</products>
создает искомое, правильный результат :
product_name price remark
Pen 10 Pen+Pencil+Bag
Pencil 20 Pen+Pencil+Bag
Bag 25 Pen+Pencil+Bag