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

ladyhawke
ladyhawke (33.372 point. Point ude: 190)

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/ (...)
    xmlns:d="http://schemas.microsoft.com/ (...)
    version="1.0" exclude-result-prefixes="xsl msxsl ddwrt"
    xmlns:ddwrt="http://schemas.microsoft.com/ (...)
    xmlns:asp="http://schemas.microsoft.com/ (...)
    xmlns:__designer="http://schemas.microsoft.com/ (...)
    xmlns:xsl="http://www.w3.org/ (...)
    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 (1.004.188 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 (33.372 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 (1.004.188 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/ (...) 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 (33.372 point)
sejt! Det prøver jeg lige...

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

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

Benytte XSLT til tranformering af data imellem 2 systemer

Oprettet den 8. december 2011 kl. 11.52
bongo13 giver 60 point for svar | Giv et svar »

fo:block kollapser

Oprettet den 14. november 2011 kl. 11.16
schristensen giver 200 point for svar | Giv et svar »

Select i Xpath, ignorere case

Oprettet den 20. oktober 2011 kl. 00.01
wise giver 30 point for svar | Giv et svar »

Seneste guides

Den gode bruger
Adgang til NAS-server via WAN
Kollektion af Batch tutorials (FJERNET)
Tilpas din YouTube afspiller


   




Tips & Tricks fra PC World

Teaser billede

Sådan fjerner du pladskrævende metadata fra dine fotos

Det er langt fra altid, at dine billeders metadata såsom kameramodel og geografisk placering er vigtige at bevare. JPG & PNG Stripper kan luge ud i billedfilerne, så de fylder meget mindre....


Anmeldelser fra PC World

Teaser billede

Test: Superlet bærbar med mange muligheder

Toshiba har med Satellite Z830 skabt en af verdens letteste ultrabooks. Den vejer 1,1 kilo, og computeren på 13 tommer ser på papiret ud til at være en oplagt rejsekammerat. Men den lave vægt har...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Samsung Galaxy S III på vej

Samsungs bedst sælgende smartphone nogensinde får en efterfølger om kort tid.


Nyheder fra Computerworld

Teaser billede

Apple retter hele 51 sikkerhedshuller i Mac OS X

Apple lukker hele 51 sårbarheder i Mac OS X, hvoraf de fleste er kritiske. Se her, hvor hullerne er.


Kurser
Samarbejdspartnere

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