Наибольшая сумма значений на группу в XSL - PullRequest
3 голосов
/ 02 августа 2010

Вероятно, есть очень простое решение этой проблемы. Я мог бы легко сделать это в C # -LINQ. К сожалению, я не так опытен с XPath и XSL.

У меня есть входной XML-файл, который содержит следующую структуру:

<group>
    <val>1</val>
    <val>3</val>
    <val>1</val>
</group>
<group>
    <val>3</val>
    <val>2</val>
    <val>2</val>
</group>

Теперь в моем XSL-преобразовании я хочу определить 1 переменную «highestsum», которая содержит наибольшую сумму «значений». Так, для примера, он вернул бы 7, сумму всех значений во второй группе.

После некоторых поисков это самое близкое решение, которое я нашел:

http://w3schools.invisionzone.com/index.php?showtopic=24265

Но у меня есть ощущение, что есть лучший способ, чем использовать сортировку в шаблоне для достижения этого результата. Любой берущий?

1 Ответ

3 голосов
/ 02 августа 2010

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))
...