Oprettet man. d. 18. januar 2010 kl. 14:23:09

ladyhawke
ladyhawke (30.667 point. Point ude: 130)

Sum af danske tal i XSLT

Jeg har noget XML fra en DataView Web Part i SharePoint.

Ideen er at jeg gerne vil summere tallene i en af kolonnerne fra denne (Distance i dette tilfælde). Da SharePointen i dette tilfælde er dansk, så er tallene f.eks.

4,5
-3,3
4
<tom værdi>
-2,1

Jeg kan godt finde frem til disse tal via XPath:
/dsQueryResponse/Rows/Row/@Distance

Men hvordan får jeg summeret tallene i XSLT, for den kan ikke håndtere det danske decimaltegn, men kun det engelske ('.').

Medtager lige stylesheet definitionen her, hvis det har betydning for mulige forslag:

<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema"
    xmlns:d="http://schemas.microsoft.com/sharepoint/dsp"
    version="1.0" exclude-result-prefixes="xsl msxsl ddwrt"
    xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
    xmlns:asp="http://schemas.microsoft.com/ASPNET/20"
    xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"   
    xmlns:SharePoint="Microsoft.SharePoint.WebControls"
    xmlns:ddwrt2="urn:frontpage:internal">

Skrevet man. d. 18. januar 2010 kl. 18:24:10| #1

arne_v
arne_v (929.897 point)
kan du summere over feltet med alle komma replaced med punktum ?

Skrevet man. d. 18. januar 2010 kl. 18:32:57| #2

ladyhawke
ladyhawke (30.667 point)
Det bør jeg kunne, men det skal jo stadig behandles som tal (mener at det er XSLT version 1) og resultatet skal vises med komma som decimal seperator, selvom udregningen er med punktum.

Skrevet tir. d. 19. januar 2010 kl. 02:39:36| #3

arne_v
arne_v (929.897 point)
Nu har jeg eksperimenteret lidt. Og det var lidt mere tricky end som så.

Men lidt googling fandt den rette inspiration.


<?xml-stylesheet type="text/xsl" href="C:/tal.xsl"?>
<alletal>
  <t>12</t>
  <t>56</t>
  <tal>12,34</tal>
  <tal>56,78</tal>
</alletal>



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

<xsl:template match="/">
sum /t = <xsl:value-of select="sum(//t)"/>
sum //tal = <xsl:value-of select="sum(//tal)"/>
xsum //tal = <xsl:call-template name="xsum"><xsl:with-param name="currnode" select="//tal[1]"/></xsl:call-template>
</xsl:template>

<xsl:template name="xsum">
    <xsl:param name="currnode"/>
    <xsl:param name="res" select="0"/>
    <xsl:choose>
        <xsl:when test="$currnode">
            <xsl:call-template name="xsum">
                <xsl:with-param name="currnode" select="$currnode/following-sibling::tal[1]"/>
                <xsl:with-param name="res" select="$res + translate($currnode,',','.')"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="translate($res,'.',',')"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>



sum /t = 68
sum //tal = NaN
xsum //tal = 69,12

Skrevet tir. d. 19. januar 2010 kl. 07:43:15| #4

ladyhawke
ladyhawke (30.667 point)
sejt! Det prøver jeg lige...

Skrevet tir. d. 19. januar 2010 kl. 08:03:49| #5

ladyhawke
ladyhawke (30.667 point)
Jeg har lige prøvet på disse data:

<Rows>
  <row Distance="2,00000000000000" vægtforskel="-2,0000000000"  />
  <row Distance="3,50000000000000" Vægtforskel="1,00000000000"  />
  <row Distance="4,00000000000000" Vægtforskel="-2,0000000000"  />
  <row Distance="0" Vægtforskel="-1,50000000000"  />
</Rows>

Men jeg får ikke summen, kun værdien af 1. node (hhv. 2 og -2)

Jeg kalder den sådan her:
xsum //Distance = <xsl:call-template name="xsum"><xsl:with-param name="currnode" select="//row/@Distance[1]"/></xsl:call-template>
        xsum //Vægtforskel = <xsl:call-template name="xsum"><xsl:with-param name="currnode" select="//row/@Vægtforskel[1]"/></xsl:call-template>

Har du nogen ide om hvor jeg har bøffet i det?

Skrevet tir. d. 19. januar 2010 kl. 08:15:53| #6

ladyhawke
ladyhawke (30.667 point)
Desuden, hvordan får jeg den til at ignorere tomme felter? Altså noget a la:

<Rows>
  <row Distance="2,00000000000000" vægtforskel="-2,0000000000"  />
  <row Distance="3,50000000000000" Vægtforskel="1,00000000000"  />
  <row Distance="4,00000000000000" Vægtforskel=""  />
  <row Distance="" Vægtforskel="-1,50000000000"  />
</Rows>

Skrevet ons. d. 20. januar 2010 kl. 10:28:06| #7

ladyhawke
ladyhawke (30.667 point)
<xsl:decimal-format name="da-DK" decimal-separator="," grouping-separator="." minus-sign="-" NaN="Ikke tal"/>

  <xsl:output method="html"/>     
    <xsl:template match="/">
        <xsl:text>Distance tilbagelagt = </xsl:text>       
        <xsl:call-template name="xsum">
            <xsl:with-param name="currnode" select="//Row[1]"/>
            <xsl:with-param name="attr-type" select="'Distance'"/>
            <xsl:with-param name="res" select="0"/>
        </xsl:call-template> km


    <xsl:template name="xsum">
        <xsl:param name="currnode"/>
        <xsl:param name="attr-type"/>
        <xsl:param name="res" select="0"/>
        <xsl:choose>
            <xsl:when test="$currnode/following-sibling::Row">
                <xsl:call-template name="xsum">
                    <xsl:with-param name="currnode" select="$currnode/following-sibling::Row[1]"/>
                    <xsl:with-param name="attr-type" select="$attr-type"/>
                    <xsl:with-param name="res" select="$res + number(translate($currnode/@*[name() = $attr-type],',','.'))"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="format-number($res + number(translate($currnode/@*[name() = $attr-type],',','.')), '#,##','da-DK')"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

Virker... Jeg havde simpelthen valgt den forkerte node at starte med...

arne_v>> Læg et svar! Som altid super godt svar :o)

Skrevet ons. d. 20. januar 2010 kl. 20:37:08| #8


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

for-each - udelade og ignorere

Oprettet den 28. august 2010 kl. 16.10
brynil giver 100 point for svar | Giv et svar »

Fjern dubletter

Oprettet den 24. august 2010 kl. 09.48
agentjna giver 60 point for svar | Giv et svar »

Newbie - hjælp

Oprettet den 18. august 2010 kl. 09.59
agentjna giver 60 point for svar | Giv et svar »

Seneste guides

100% højde med CSS i alle browsere
XML
2 Ting du skal holde øje med





Tips & Tricks fra PC World

Teaser billede

Sådan udspionerer du Google

Søgegiganten Google ved uhyggeligt meget om dig. Med Google Alarm får du besked, hver gang der sendes oplysninger om dig til Googles servere.


Anmeldelser fra PC World

Teaser billede

Test: Smart GPS-ur til løb og cykelture

Garmins Forerunner 110 er en meget underholdende makker, uanset om du løber, kører mountainbike i skoven eller drøner rundt på rulleskøjter. Vi har testet det GPS-baserede motions-ur.


Seneste blogindlæg

Teaser billede

Kvittering og status

På Eksperten er der 914.000 spørgsmål. Af dem er 162.000 åbne spørgsmål hvor der ikke er et accepteret svar, selvom der ligger forslag til svar på 63.000 af dem. Mange af dem ligger mange år...


Nyheder fra PC World

Teaser billede

Samsung udfordrer iPad med toptunet Android-tablet

Syv tommer skærm, Googles mobile styresystem og en vægt på 380 gram. Samsung har afsløret detaljerne om Galaxy Tab, der er sydkoreanernes bud på en konkurrent til Apples iPad. Mød tablet-pc'en...


Nyheder fra Computerworld

Teaser billede

Her er de farligste job i teknologi-verdenen

Du risikerer både liv og helbred, hvis du arbejder med disse job i teknologisektoren.



Kurser
Samarbejdspartnere

Udgiver · © 2010 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301