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

ladyhawke
ladyhawke (29.512 point)

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 (897.377 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 (29.512 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 (897.377 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 (29.512 point)
sejt! Det prøver jeg lige...

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

ladyhawke
ladyhawke (29.512 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 (29.512 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 (29.512 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

problem når man nu ikke kan reasigne

Oprettet den 23. februar 2010 kl. 12.21
pnr giver 45 point for svar | Giv et svar »

Bruge AjaxControlToolkit

Oprettet den 23. februar 2010 kl. 06.42
kapoou giver 100 point for svar | Giv et svar »

& tegn - skal ændres til &amp;

Oprettet den 15. februar 2010 kl. 11.37
agentjna giver 30 point for svar | Giv et svar »

Seneste guides

Logging i Java
Prepared Statements
Parameters





Tips & Tricks fra PC World

Teaser billede

Hold nallerne fra min Windows!

Hvis du lader andre bruge din pc, er det en god idé ikke at give dem adgang til de administrative funktioner i Windows 7. Se her hvordan du får dem til at holde nallerne væk.


Anmeldelser fra PC World

Teaser billede

Test: Fin Blu-ray-afspiller til under 1.000 kroner

Er du træt af grovkornede udsendelser på din finkornede HD-skærm? Så skal du have en Blu-ray-afspiller. Og den behøver ikke koste en formue. Vi har testet en billig model.


Seneste blogindlæg

Teaser billede

PHP webudvikler søges

Vil du være med til at forme fremtidens medier, og kan du lide at arbejde selvstændigt? Så har vi jobbet til dig. En af vores dygtige webudviklere har fået nyt job. Derfor søger vi en webudvikler...


Nyheder fra PC World

Teaser billede

Google: Drop din stationære pc og brug mobilen

Google gider ikke de traditionelle computere længere. Firmaets tjenester og tilbud fokuserer nu på mobiltelefonen.


Nyheder fra Computerworld

Teaser billede

Galleri: Her vil du også finde Android i fremtiden

Googles mobile styresystem har oplevet en enorm popularitet på adskillige telefoner, men det er ikke kun på mobilen, at vi frem over vil møde Android. Se her hvor styresystemet også sniger sig ind.



Kurser
Samarbejdspartnere

Udgiver · © 2007 IDG Danmark A/S · Carl Jacobsens Vej 25 · 2500 Valby · Tlf.: 77 300 300 · Fax: 77 300 301 | 33