2010-08-02 3 views
8

Как найти наибольшие 2 числа из 3 чисел и выполнить некоторые арифметические операции над ними, как в следующем примере?арифметическая операция в XSLT

<root> 
    <num>10</num> 
    <num>12</num> 
    <num>8</num> 
</root> 

Для приведенного выше ввода кода XSLT должен отображать "10 + 12 = 22" и "средний = 11".

+1

Это звучит как домашнее задание. SO люди склонны игнорировать вопросы типа «дайте мне ответ». Что вы пробовали? Покажите, что вы сделали и что не работает. –

+0

@Jim Garrisson: Я не знаю, как делать арифметические операции в xslt !!! Это не моя домашняя работа. – brainless

+1

@Jim Garrisson: моя проблема намного больше. Например, я дал небольшой фрагмент кода. и я не школьный ребенок !!! – brainless

ответ

14

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="/root"> 
     <xsl:variable name="max1" select="num[not(../num > .)]"/> 
     <xsl:variable name="max2" select="num[not(../num[count(.|$max1)!=1] > .)]"/> 
     <xsl:value-of select="concat($max1,' + ', 
            $max2,' = ', 
            $max1 + $max2,'&#xA;', 
            'average = ', 
            ($max1 + $max2) div 2,'&#xA;')"/> 
    </xsl:template> 
</xsl:stylesheet> 

Выход:

12 + 10 = 22 
average = 11 
9

И. XSLT 1.0 Раствор

Это преобразование находит сумму и среднее значение всех чисел, за исключением тех, с минимальным значение - работает для набора узлов номеров любой длины:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:variable name="vMin"> 
    <xsl:for-each select="/*/num"> 
    <xsl:sort data-type="number"/> 
    <xsl:if test="position()=1"> 
    <xsl:value-of select="."/> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:variable> 

<xsl:variable name="vNumsWithoutMin" select="/*/num[not(.=$vMin)]"/> 

<xsl:variable name="vSumWithoutMin" select="sum($vNumsWithoutMin)"/> 

<xsl:template match="/*"> 
    <xsl:apply-templates select="$vNumsWithoutMin"/> 
    <xsl:value-of select="concat(' = ', $vSumWithoutMin)"/> 
    average = <xsl:value-of select= 
    "$vSumWithoutMin div count($vNumsWithoutMin)"/> 
</xsl:template> 

<xsl:template match="num"> 
    <xsl:value-of select="."/> 
    <xsl:if test="not(position()=last())"> 
    <xsl:text> + </xsl:text> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

Когда это применяется на прилагаемом документе XML:

<root> 
    <num>10</num> 
    <num>12</num> 
    <num>8</num> 
</root> 

разыскиваемый, правильный результат получается:

10 + 12 = 22 
average = 11 

II. Решение XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output method="text"/> 

<xsl:variable name="vMin" select="min(/*/num/number(.))"/> 

<xsl:variable name="vNumsSansMin" 
    select="/*/num[not(number() eq $vMin)]/number(.)"/> 
<xsl:variable name="vAvgSansMin" 
     select="avg($vNumsSansMin)"/> 

<xsl:template match="/*"> 
    <xsl:sequence select= 
    "(for $i in 1 to count($vNumsSansMin) 
     return 
     ($vNumsSansMin[$i], 
      if(not($i eq count($vNumsSansMin))) 
      then ' + ' 
      else() 
     ) 
    ), 
     ' = ', sum($vNumsSansMin) 
    "/> 

    average = <xsl:sequence select="$vAvgSansMin"/> 
</xsl:template> 
</xsl:stylesheet> 
Смежные вопросы