2010-08-02 18 views
8

में अंकगणितीय ऑपरेशन मैं 3 संख्याओं में से सबसे बड़ी 2 संख्या कैसे प्राप्त कर सकता हूं और उन पर कुछ अंकगणितीय परिचालन कैसे कर सकता हूं जैसे कि उदाहरण में?एक्सएसएलटी

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

उपर्युक्त इनपुट के लिए xslt कोड "10 + 12 = 22" और "औसत = 11" प्रदर्शित करना चाहिए।

+1

यह होमवर्क की तरह लगता है। इसलिए लोग "मुझे जवाब दें" प्रकार के प्रश्नों को अनदेखा करते हैं। आपने क्या प्रयास किया है दिखाएं कि आपने क्या किया है और क्या काम नहीं कर रहा है। –

+0

@ जिम गैरीसन: मुझे नहीं पता कि xslt में अंकगणितीय परिचालन कैसे करें !!! यह मेरा घर का काम नहीं है। – brainless

+1

@ जिम गैरीसन: मेरी समस्या बहुत बड़ी है। उदाहरण के लिए मैंने कोड का सिर्फ एक छोटा सा स्निपेट दिया है। और मैं एक स्कूल बच्चा नहीं हूँ !!! – 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 

द्वितीय। एक्सएसएलटी 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>