I.Хорошее решение XSLT 1.0 (краткое, эффективное и понятное):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:for-each select="group">
<xsl:sort select="sum(val)" data-type="number"
order="descending"/>
<xsl:if test="position()=1">
<xsl:value-of select="sum(val)"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется к следующему документу XML :
<t>
<group>
<val>1</val>
<val>3</val>
<val>1</val>
</group>
<group>
<val>3</val>
<val>2</val>
<val>2</val>
</group>
</t>
желаемый, правильный результат получается :
7
Чтобы получить требуемое определение переменной , просто поместите инструкцию <xsl:for-each>
из приведенного выше кода втело переменной.
II.Еще лучшее решение XSLT 2.0 (и фактически XPath 2.0 с одной строкой) :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:sequence select="max(group/sum(val))"/>
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется к тому же XML-документу, получается тот же правильный ответ :
7
И определение требуемой переменной просто :
<xsl:variable name="vHighestSum"
select="max(group/sum(val))"/>
Наконец, , то же выражение Xpath можно использовать вXQuery для определения необходимой переменной:
let $vHighestSum := max(/*/group/sum(val))