webForumDet fria alternativet

Addering samt muliplikation med XSLT/XSL

XML

11 svar · 620 visningar · startad av SPiN

Medlem sedan mars 20007 896 inlägg
Frågan#1

Hej!

Jag sitter och klurar på hur jag ska kunna addera samt multiplicera med XSLT? Jag har fyra variabler med värden som jag vill multiplicera samt addera ihop. Jag vet inte om jag gör på rätt sätt, ni får jättegärna komma med tips. :)

// Variablerna
<xsl:variable name="smAntal">
     5
</xsl:variable>
<xsl:variable name="smPris">
     25
</xsl:variable>
<xsl:variable name="lgAntal">
     1
</xsl:variable>
<xsl:variable name="lgPris">
     35
</xsl:variable>

// Sättet som jag försökte lägga ihop det totala priset:
<xsl:variable name="totPris" select="number([[$smAntal*$smPris]+[$lgAntal*$lgPris]])" />

Självklart skulle jag kunna strukturera om mitt XML-dokument, och lägga till fält med dessa värden - men helst vill jag undvika det.

Några tips & råd?

Medlem sedan dec. 2002789 inlägg
#2

Funkar inte detta?

<xsl:value-of select="number( ($smAntal * $smPris) + ($lgAntal * $lgPris) )" />

Om du vill ha summan i en ny variabel så kan du göra så här:

<xsl:variable name="total"><xsl:value-of select="number( ($smAntal * $smPris) + ($lgAntal * $lgPris) )" /></xsl:variable>

<!-- skriva ut den nya variabeln -->
<xsl:value-of select="$total" />
Medlem sedan mars 20007 896 inlägg
#3

Tackar, funkar perfekt. :)

Medlem sedan mars 20007 896 inlägg
#4

Kan jag inte använda mig av decimaltal? Jag har ett par fält i XML-dokumentet som kan innehålla ett decimal-tal, som jag vill multiplicera. Är jag tvungen att avrunda dessa med round() innan jag kan multiplicera dessa med andra tal?

Jag får alltid ett NaN, Not a number - vare sig jag använder punkt eller komma-tecken.

Medlem sedan dec. 2002789 inlägg
#5

Decimalerna fungerar utmärkt för mig. Använder mig av punkten som decimalavgränsare.

Om jag tar dina variabelexempel och ändrar de lite

<xsl:variable name="smAntal">5.25</xsl:variable>
<xsl:variable name="smPris">25</xsl:variable>
<xsl:variable name="lgAntal">1.5</xsl:variable>
<xsl:variable name="lgPris">35</xsl:variable>

Då skriver följande kod att totalen är lika med 183,75.

<xsl:variable name="total"><xsl:value-of select="number( ($smAntal * $smPris) + ($lgAntal * $lgPris) )" /></xsl:variable>

<xsl:value-of select="$total" />

Vad är det för parser du använder dig av? Själv kör jag med MSXML 4.0.

Medlem sedan mars 20007 896 inlägg
#6

Hm, så att jag inte ens kunde använda heltal på det sätt jag gör.

<xsl:for-each select="xmlRootElement/xmlElementList">

<xsl:variable name="itemPris">
     <xsl:value-of select="xmlElementPris" />
</xsl:variable>
<xsl:variable name="itemAntal">
     <xsl:value-of select="xmlElementAntal" />
</xsl:variable>
<xsl:variable name="totPris">
     <xsl:value-of select="number( $itemPris * $itemAntal )" />
</xsl:variable>

<xsl:value-of select="$totPris" />
</xsl:for-each>

På följande XML-träd:

<xmlRootElement>
     <xmlElementList>
          <xmlElementPris>10.00</xmlElementPris>
          <xmlElementAntal>20</xmlElementAntal>
     </xmlElementList>
     <xmlElementList>
          <xmlElementPris>15.90</xmlElementPris>
          <xmlElementAntal>15</xmlElementAntal>
     </xmlElementList>
</xmlRootElement>
Medlem sedan mars 20007 896 inlägg
#7

Jag använder Mozilla för att visa mina parsade XML-dokument. Som du ser nu, använder jag node-värden från ett XML-dokument den här gången, inte inskrivna variabler. :)

Medlem sedan dec. 2002789 inlägg
#8

Hmmm... Din kod fungerar utmärkt hos mig med MSXML 4.0.

Men som du säger så fungerar den inte i Mozilla. Mysko.

Medlem sedan mars 20007 896 inlägg
#9

Inte heller i IE, med WinXP Pro. ( MSXML3? ) :(

Medlem sedan dec. 2002789 inlägg
#10

Funkar även i MSXML 3 hos mig (XP Home).

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="xmlRootElement">
    <xsl:for-each select="xmlElementList">

        <xsl:variable name="itemPris">
            <xsl:value-of select="xmlElementPris" />
        </xsl:variable>
        <xsl:variable name="itemAntal">
            <xsl:value-of select="xmlElementAntal" />
        </xsl:variable>
        <xsl:variable name="totPris">
            <xsl:value-of select="number( $itemPris * $itemAntal )" />
        </xsl:variable>
		
        <xsl:text>Pris: </xsl:text><xsl:value-of select="xmlElementPris" /><br />
        <xsl:text>Antal: </xsl:text><xsl:value-of select="xmlElementAntal" /><br />
        <xsl:text>Totalt: </xsl:text><xsl:value-of select="$totPris" /><br /><br />

    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Medlem sedan mars 20007 896 inlägg
#11

Funkar kanon i IE, men ger ingen utskrift alls i Mozilla Firebird. :l

Märkligt! Jag får väl fortsätta försöka få till det för Mozilla också, tack för all hjälp!

Medlem sedan dec. 2002789 inlägg
#12

Fick det att fungera i Mozilla 1.3 och Netscape 7.01.

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

<xsl:template match="xmlRootElement">
<html>
    <head>
        <title>Mozilla Test</title>
    </head>
    
    <body>
    <xsl:for-each select="xmlElementList">
        <xsl:variable name="pris">
            <xsl:value-of select="xmlElementPris"/>
        </xsl:variable>
        <xsl:variable name="antal">
            <xsl:value-of select="xmlElementAntal"/>
        </xsl:variable>
				
        <xsl:variable name="total">
            <xsl:value-of select="number($pris * $antal)"/>
        </xsl:variable>

        <xsl:value-of select="$total"/><br/><br/>
    </xsl:for-each>
    </body>
</html>
</xsl:template>
</xsl:stylesheet>
268 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
131 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
132 ms — ändringar (db)