Вот решение с использованием мюнхенской группировки :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kBookByNums"
match="Book" use="number(current_inventory)"/>
<xsl:template match="/*">
<xsl:for-each select=
"Book
[generate-id()
=
generate-id(key('kBookByNums',
number(current_inventory)
)[1]
)
]
">
<xsl:sort select="current_inventory"
data-type="number" order="descending"/>
<xsl:if test="position()=1">
<xsl:copy-of select=
"key('kBookByNums',
number(current_inventory)
)"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к предоставленному XML-документу, получается правильный результат :
<Book>
<sku>12345</sku>
<title>Beauty Secrets</title>
<condition>New</condition>
<current_inventory>20</current_inventory>
<price>99.99</price>
</Book>
<Book>
<sku>54321</sku>
<title>Picturescapes</title>
<current_inventory>20</current_inventory>
<condition>New</condition>
<price>50.00</price>
</Book>
Обновление
Может показаться, что решение этого xsl-ключа «разыгрывает свою« карту эффективности »только для больших входных документов (то есть тысяч книг)», как кто-то сказал. На самом деле такое утверждение весьма неточно.
Улучшение эффективности может быть значительным, даже если элементов не так много , , если количество различных значений очень мало по сравнению с общим числом значений . Таким образом, даже для довольно небольших наборов элементов (одна-двести) существенный эффект имеет место, если число различных значений не превышает 10-20 - то, что происходит во многих реальных случаях.
Важное значение имеет малое отношение количества различных значений к общему размеру .