Avatar billede CodingJoe Nybegynder
11. maj 2010 - 17:43 Der er 42 kommentarer og
1 løsning

Hjælp til transformation af xml i dårlig kvalitet.

Jeg sidder og prøver at transformere noget xml, der mildt sagt er af meget dårlig kvalitet. Dette medfører desværre xslt i afart, man måske godt kunne undvære. Desværre kan jeg ikke ordne xml data, da jeg ikke har lov til det. Så derfor har jeg brug for lidt hjælp.

- Jeg har en oversigt over kunder. Samme kunde fremgår flere gange i xml data (redundans).
- Jeg har brug for at gruppere data, så data er samlet for en kunde. Herudover hvis kunden har samme ordrenr på nogle varer skal disse samles.
- Til sidst skal prisen lægges sammen med et ialt beløb pr ordre (dvs dem med samme ordre nummer).

Xml strukturen ser således ud:
<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="oversigt.xsl"?>
<Kunder>
  <Kunde>
    <Navn>Allan Simonsen</AssNavn>
    <Ordrenr>10001-004</Ordrenr>
    <Ordre>
      <ProduktId>211169-66</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>350,86</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Allan Simonsen</AssNavn>
    <Ordrenr>10001-004</Ordrenr>
    <Ordre>
      <ProduktId>211169-56</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>305,76</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Allan Simonsen</AssNavn>
    <Ordrenr>10001-004</Ordrenr>
    <Ordre>
      <ProduktId>211169-46</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>250,41</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Allan Simonsen</AssNavn>
    <Ordrenr>1004-003</Ordrenr>
    <Ordre>
      <ProduktId>123869-18</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>750,41</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Martin Jespersen</AssNavn>
    <Ordrenr>1004525-003</Ordrenr>
    <Ordre>
      <ProduktId>211169-46</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>250,41</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Martin Jespersen</AssNavn>
    <Ordrenr>1004525-003</Ordrenr>
    <Ordre>
      <ProduktId>2119-460</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>246,41</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Martin Jespersen</AssNavn>
    <Ordrenr>1004525-002</Ordrenr>
    <Ordre>
      <ProduktId>2119-460</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>246,41</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Martin Jespersen</AssNavn>
    <Ordrenr>1004525-002</Ordrenr>
    <Ordre>
      <ProduktId>2119-461</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>476,31</Pris>
    </Ordre>
  </Kunde>
</Kunder>

Jeg har selv forsøgt med at bruge preceding::sibling, men vil ikke poste det jeg har ind her, da det nok vil påvirke Jer eksperter :)

Data skal præsenteres således, at der i starten skrives navn på kunden (Allan Simonsen) én gang, og herefter kommer ordrenr, hvorefter, der er en html tabel med en tabel header:
Navn: [Kundenavn]
Ordre: [OrdreNr]
[ProduktId][SalgsDato][Pris]
...
...
...
Ialt beløb:

Er der nogen, der kan hjælpe? :)
Avatar billede CodingJoe Nybegynder
11. maj 2010 - 17:52 #1
For at illustrer mit behov her er eksempel:

Navn: Allan Simonsen (én gang)
Ordre: 10001-004
ProduktId | SalgsDato  | Pris
--------------------------------
211169-66 | 01.02.2010 | 350,86
211169-56 | 01.02.2010 | 305,76
211169-46 | 01.02.2010 | 250,41

Ialt beløb: 907,03

Ordre: 1004-003
ProduktId | SalgsDato  | Pris
--------------------------------
123869-18 | 01.02.2010 | 750,41

Ialt beløb: 750,41


Navn: Martin Jespersen (én gang)
Ordre: 1004525-003
ProduktId | SalgsDato  | Pris
--------------------------------
211169-46 | 01.02.2010 | 250,41
...
...
...
Avatar billede CodingJoe Nybegynder
11. maj 2010 - 21:30 #2
lille fejl i xml strukturen 'AssNavn' = 'Navn'.
Avatar billede jokkejensen Novice
12. maj 2010 - 16:49 #3
Hej..

Jeg får følgende:

© Kraks Forlag AS © D.A.V. © COWI  50 km KortFotoKombi  CentrérPrintZoom
Allan Simonsen
Ordrer:
10001-004 - 350,86
10001-004 - 305,76
10001-004 - 250,41
1004-003 - 750,41
sum : 1657.44
Martin Jespersen
Ordrer:
1004525-003 - 250,41
1004525-003 - 246,41
1004525-002 - 246,41
1004525-002 - 476,31
sum : 1219.54


Med:

<xsl:template match="Kunder">
        <xsl:apply-templates select="Kunde[not(Navn=preceding-sibling::Kunde/Navn)]" mode="OrderHead" />
    </xsl:template>

    <xsl:template match="Kunde" mode="OrderHead">
        <br></br>
        <xsl:variable name="Navn" select="Navn"></xsl:variable>
        <xsl:value-of select="$Navn"/>
        <br></br>
        Ordrer:<br></br>
        <xsl:for-each select="/Kunder//Kunde[$Navn = Navn]">
            <xsl:value-of select="Ordrenr"/> - <xsl:value-of select="Ordre/Pris"/>
            <br></br>
        </xsl:for-each>
        <xsl:variable name="TempSum">
            <pris>
                <xsl:for-each select="/Kunder/Kunde/Ordre//Pris[../../Navn = $Navn]">
                    <o>
                        <xsl:value-of select="translate(., ',', '.')"/>
                    </o>
                </xsl:for-each>
            </pris>
        </xsl:variable>
        sum : <xsl:value-of select="sum(msxml:node-set($TempSum)//o)"/>   
    </xsl:template>


Bemærk jeg bruger msxsl NS, da jeg skal lave et midlertidigt xml ark for at lave komma om til punktum.. Generelt er det BAD practice at formatere sit data dansk.

/J
Avatar billede CodingJoe Nybegynder
17. maj 2010 - 00:41 #4
Beklager det sene tilbagemelding, men jeg må lige prøve dit forslag.

Smid bare et svar ind :)

Jeg er sikker på, jeg kan bygge videre på dit.
Avatar billede jokkejensen Novice
17. maj 2010 - 06:09 #5
ja, så lige at du også vil have dem grupperet efter ordre, sig til hvis det driller.
Avatar billede CodingJoe Nybegynder
17. maj 2010 - 09:00 #6
Jeps. Jeg skriver lige, hvis det driller...XSLT er ikke min stærke side :S
Avatar billede CodingJoe Nybegynder
17. maj 2010 - 09:10 #7
Hvordan skal starten af xslt'en se ud? Det er vel i den msxml namespacet skal angives?

Lige nu får jeg en ukendt fejl. :(
Avatar billede jokkejensen Novice
17. maj 2010 - 09:15 #8
xmlns:msxml="urn:schemas-microsoft-com:xslt"
Avatar billede CodingJoe Nybegynder
17. maj 2010 - 09:27 #9
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxml="urn:schemas-microsoft-com:xslt">

Med denne i toppen af xsl filen, giver den stadigvæk en fejl. xml filen er er velformet.

Iøvrigt kan jeg se på nettet, at der også er noget, der hedder msxsl:nodeset...
Avatar billede jokkejensen Novice
17. maj 2010 - 09:32 #10
ja msxml:node-set() ligger i det namespace..

Får du ikke en "fejl" ? smid evt lige et space mellem xmlns:xsl og xmlns:msxml
Avatar billede jokkejensen Novice
17. maj 2010 - 09:35 #11
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
    <!ENTITY nbsp "&#x00A0;">
]>
<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxml="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxml">
Avatar billede jokkejensen Novice
17. maj 2010 - 09:36 #12
msxml er afhængigt af miljø, hvis det ikke er en windows box, skal du nok finde et alternativ.
Avatar billede CodingJoe Nybegynder
17. maj 2010 - 09:36 #13
Jeg fik det til at virke....
Avatar billede CodingJoe Nybegynder
17. maj 2010 - 09:38 #14
Jeg prøver lige at gruppere informationer efter ordre...håber ikke jeg starter endnu et hæsblæsende xslt kodning forsøg :S
Avatar billede CodingJoe Nybegynder
17. maj 2010 - 09:55 #15
Jeg kan se du har en <pris> tag defineret i html delen. Jeg går udfra det ikke er et krav...jeg vil nemlig kun ha' ren HTML ud. :)
Avatar billede jokkejensen Novice
17. maj 2010 - 10:02 #16
Den bruger jeg bare midlertidigt i den variable, den kommer ikke med ud.

Det er for at kunne iterere igennem priserne på ordrene og ligge dem sammen. Du har brugt komma til decimal, det skal være punktum, så i min variable erstatter jeg lige komma med punktum.

/J
Avatar billede CodingJoe Nybegynder
17. maj 2010 - 10:54 #17
Ja, fandt ud af det bagefter :S

XSLT er vist ikke mig....
Avatar billede jokkejensen Novice
17. maj 2010 - 11:30 #18
du siger bare til hvis jeg skal gruppere de ordrer også..
Avatar billede CodingJoe Nybegynder
17. maj 2010 - 12:25 #19
Du må gerne give det et shot :)
Avatar billede jokkejensen Novice
17. maj 2010 - 14:16 #20
Allan Simonsen
Ordrer:
10001-004:
211169-66, 01.02.2010, 350,86
211169-56, 01.02.2010, 305,76
211169-46, 01.02.2010, 250,41
order sum: 907.03
1004-003:
123869-18, 01.02.2010, 750,41
order sum: 750.41
total sum : 1657.44


Martin Jespersen
Ordrer:
1004525-003:
211169-46, 01.02.2010, 250,41
2119-460, 01.02.2010, 246,41
order sum: 496.82
1004525-002:
2119-460, 01.02.2010, 246,41
2119-461, 01.02.2010, 476,31
order sum: 722.72
total sum : 1219.54





<xsl:template match="Kunde" mode="OrderHead">
        <br></br>
        <xsl:variable name="Navn" select="Navn"></xsl:variable>
        <h1>
            <xsl:value-of select="$Navn"/>
        </h1>
        <h2>
            Ordrer:
        </h2>
        <xsl:apply-templates select="/Kunder//Kunde[not(Ordrenr=preceding-sibling::Kunde/Ordrenr) and Navn = $Navn]" mode="Orders"></xsl:apply-templates>
        <xsl:variable name="TempSum">
            <pris>
                <xsl:for-each select="/Kunder/Kunde/Ordre//Pris[../../Navn = $Navn]">
                    <o>
                        <xsl:value-of select="translate(., ',', '.')"/>
                    </o>
                </xsl:for-each>
            </pris>
        </xsl:variable>
        <br></br>
        total sum : <xsl:value-of select="sum(msxml:node-set($TempSum)//o)"/><br></br>
    </xsl:template>

    <xsl:template match="Kunde" mode="Orders">
        <xsl:variable name="Ordrenr" select="Ordrenr"></xsl:variable>
        <h3>
            <xsl:value-of select="$Ordrenr"/>:
        </h3>
        <xsl:apply-templates select="//Kunde[Ordrenr = $Ordrenr]" mode="OrderLine"></xsl:apply-templates>
        <xsl:variable name="TempSum">
            <pris>
                <xsl:for-each select="/Kunder/Kunde/Ordre//Pris[../../Ordrenr = $Ordrenr]">
                    <o>
                        <xsl:value-of select="translate(., ',', '.')"/>
                    </o>
                </xsl:for-each>
            </pris>
        </xsl:variable>
        order sum:    <xsl:value-of select="sum(msxml:node-set($TempSum)//o)"/>
    </xsl:template>

    <xsl:template match="Kunde" mode="OrderLine">
        <xsl:value-of select="Ordre/ProduktId"/>, <xsl:value-of select="Ordre/SalgsDato"/>, <xsl:value-of select="Ordre/Pris"/>
        <br></br>
    </xsl:template>
Avatar billede jokkejensen Novice
17. maj 2010 - 14:17 #21
<xsl:template match="Kunder">
        <xsl:apply-templates select="Kunde[not(Navn=preceding-sibling::Kunde/Navn)]" mode="OrderHead" />
    </xsl:template>

Glemte lige den :)
Avatar billede CodingJoe Nybegynder
17. maj 2010 - 15:21 #22
Tusinde tak ....jeg prøver...din hjælp har allerede være god. :)
Avatar billede CodingJoe Nybegynder
18. maj 2010 - 10:46 #23
Jeg har opdaget en lille ting, som ikke var tydelig for mig heller. Det viser sig, at et ordrenr godt kan være delt over  fx to kunder (i mit eksempel giver det ikke mening, men det jeg arbejder med har med sagsbehandling at gøre, og en sagsbehandler kan godt være involveret i flere sager, som andre også har haft fingrene i). Dit xslt virker fint, men den springer de ordre numre over, som har forskellige kunder.

Eksempel:

  <Kunde>
    <Navn>Allan Simonsen</Navn>
    <Ordrenr>1004-003</Ordrenr>
    <Ordre>
      <ProduktId>123869-18</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>750,41</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Martin Jespersen</Navn>
    <Ordrenr>1004-003</Ordrenr>
    <Ordre>
      <ProduktId>211169-46</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>250,41</Pris>
    </Ordre>
  </Kunde>

Her kan du se, at der er forskellige kunder, men samme ordrenr. Den regner dog fint sammen alligevel, men informationerne kommer ikke frem. Jeg har selv forsøgt at smide denne regel ind, men har ikke haft held. :(

Det er vist i denne linje reglen skal lægges ind?
<xsl:apply-templates select="/Kunder//Kunde[not(Ordrenr=preceding-sibling::Kunde/Ordrenr) and Navn = $Navn]" mode="Orders" />
Avatar billede CodingJoe Nybegynder
18. maj 2010 - 10:48 #24
Reglen er: Så længe Kundenavn er forskellig, så skal ordrenr ikke grupperes for dem som een.
Avatar billede jokkejensen Novice
18. maj 2010 - 10:53 #25
Altså ordrenr er ikke uniqt men en sammensat nøgle af ordrenummer og kundenavn ?
Avatar billede jokkejensen Novice
18. maj 2010 - 10:54 #26
<xsl:apply-templates select="/Kunder//Kunde[Navn = $Navn]" mode="Orders" />
Avatar billede CodingJoe Nybegynder
18. maj 2010 - 11:00 #27
Jeps til det første. Prøver lige dit næste....tænkte på om man kunne kalde orderline med navn som parameter, hvori man kunne spørge om navnet var uens.
Avatar billede CodingJoe Nybegynder
18. maj 2010 - 11:10 #28
Det er noget værre bras af noget xml, jeg arbejder med. Preceding skal være med, så den er god nok... måske skal jeg lige redigere lidt id den xml du har:

<Kunder>
  <Kunde>
    <Navn>Allan Simonsen</Navn>
    <Ordrenr>10001-004</Ordrenr>
    <Ordre>
      <ProduktId>211169-66</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>350,86</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Allan Simonsen</Navn>
    <Ordrenr>10001-004</Ordrenr>
    <Ordre>
      <ProduktId>211169-56</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>305,76</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Allan Simonsen</Navn>
    <Ordrenr>10001-004</Ordrenr>
    <Ordre>
      <ProduktId>211169-46</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>250,41</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Allan Simonsen</Navn>
    <Ordrenr>1004-003</Ordrenr>
    <Ordre>
      <ProduktId>123869-18</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>750,41</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Martin Jespersen</Navn>
    <Ordrenr>1004-003</Ordrenr>
    <Ordre>
      <ProduktId>211169-46</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>250,41</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Martin Jespersen</Navn>
    <Ordrenr>1004-003</Ordrenr>
    <Ordre>
      <ProduktId>2119-460</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>246,41</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Martin Jespersen</Navn>
    <Ordrenr>1004525-002</Ordrenr>
    <Ordre>
      <ProduktId>2119-460</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>246,41</Pris>
    </Ordre>
  </Kunde>
  <Kunde>
    <Navn>Martin Jespersen</Navn>
    <Ordrenr>1004525-002</Ordrenr>
    <Ordre>
      <ProduktId>2119-461</ProduktId>
      <SalgsDato>01.02.2010</SalgsDato>
      <Pris>476,31</Pris>
    </Ordre>
  </Kunde>
</Kunder>

Læg mærke til de to første Martin Jespersen forekomster vil blive sprunget over i den nuværende xslt. :S Det er fordi ordrenr er det samme hos Allan Simonsen og Martin Jespersen.
Jeg er ked af, at xml'en er meget udfordrende. Jeg har selv skrevet simple xslt'er, hvor xml data har været til at arbejde med. I det her tilfælde har udvikleren åbenbart skrevet xml genererings koden, så den passede til hans andet kode istedet for at strukturere den ordentligt.
Avatar billede CodingJoe Nybegynder
18. maj 2010 - 11:18 #29
Rækkefølgen vil altid være at dem med ens odrenr vil komme i forlængelse.
Avatar billede CodingJoe Nybegynder
18. maj 2010 - 11:20 #30
Som sagt så er beregnignen god nok....data bliver bare ikke vist :)
Avatar billede jokkejensen Novice
18. maj 2010 - 11:38 #31
ja det ligner noget fra en doven udvikler, der blot har rippet tabellen fra sql som xml :)

jeg får lige kigget på det lidt senere :)..

Men vi er enige om at både martin og allan, skal have ordrenummeret:

1004-003 med unikke ordrelinier gældende for navn og ordrenummer

og så ellers som resultatet tidligere har været.
Avatar billede CodingJoe Nybegynder
18. maj 2010 - 11:50 #32
Ja, alt ser fint ud. Den regner fint sammen i den totale sum (selv på de usynlige forekomster). Den xml jeg pastet ind er meget lig med den generelle struktur. '1004-003' ordre nummeret skal fremgå både under Allan (det gør den fint lige nu), og under Martin (mangler), og ja til med unikke ordrelinjer for navn og ordrenummer.

Tusinde tak. Jeg kan evt. forhøje point tildelingen. :)
Avatar billede CodingJoe Nybegynder
18. maj 2010 - 12:30 #33
Evt. hvis det ikke er for meget...så kunne håndtere addition af store tal. Number er ikke stort nok :S
Jeg har tal her, der overstiger 50.000, negative tal skal også kunne håndteres, så det skal være signed.

Damn jeg ville ønske det var c#, jeg havde her :(
Avatar billede jokkejensen Novice
18. maj 2010 - 12:52 #34
hehe ja det er ikke lige muligt i browseren, JS var også en effektiv mulighed hvis du hellere vil det.

Prøv lige med:

<xsl:apply-templates select="/Kunder/Kunde[not(Ordrenr=preceding-sibling::Kunde[$Navn = Navn]/Ordrenr) and $Navn = Navn]" mode="Orders"></xsl:apply-templates>

Før kiggede jeg efter preceding-sibling::Kunde, uden Navn kriterie, dvs at den efter at have mødt et ordrenummer, aldrig ville vise det igen. uanset navn.

Hvad siger du med numbers ? - har du noget xml der får det til at fejle ?
Avatar billede jokkejensen Novice
18. maj 2010 - 12:56 #35
how nej, den tager sku en forkert ordre... hold on
Avatar billede jokkejensen Novice
18. maj 2010 - 13:00 #36
<xsl:template match="Kunder">
        <xsl:apply-templates select="Kunde[not(Navn=preceding-sibling::Kunde/Navn)]" mode="OrderHead" />
    </xsl:template>
   
    <xsl:template match="Kunde" mode="OrderHead">
        <br></br>
        <xsl:variable name="Navn" select="Navn"></xsl:variable>
        <h1>
            <xsl:value-of select="$Navn"/>
        </h1>
        <h2>
            Ordrer:
        </h2>
        <xsl:apply-templates select="/Kunder/Kunde[not(Ordrenr=preceding-sibling::Kunde[$Navn = Navn]/Ordrenr) and $Navn = Navn]" mode="Orders">
            <xsl:with-param name="Navn" select="$Navn"/>
        </xsl:apply-templates>
        <xsl:variable name="TempSum">
            <pris>
                <xsl:for-each select="/Kunder/Kunde/Ordre//Pris[../../Navn = $Navn]">
                    <o>
                        <xsl:value-of select="translate(., ',', '.')"/>
                    </o>
                </xsl:for-each>
            </pris>
        </xsl:variable>
        <br></br>
        total sum : <xsl:value-of select="sum(msxml:node-set($TempSum)//o)"/><br></br>
    </xsl:template>

    <xsl:template match="Kunde" mode="Orders">
        <xsl:param name="Navn"></xsl:param>
        <xsl:variable name="Ordrenr" select="Ordrenr"></xsl:variable>   
            <h3>
                <xsl:value-of select="$Ordrenr"/>:
            </h3>
            <xsl:apply-templates select="//Kunde[Ordrenr = $Ordrenr and $Navn = Navn]" mode="OrderLine"></xsl:apply-templates>
            <xsl:variable name="TempSum">
                <pris>
                    <xsl:for-each select="/Kunder/Kunde/Ordre//Pris[../../Ordrenr = $Ordrenr and ../../Navn = $Navn]">
                        <o>
                            <xsl:value-of select="translate(., ',', '.')"/>
                        </o>
                    </xsl:for-each>
                </pris>
            </xsl:variable>
            order sum:    <xsl:value-of select="sum(msxml:node-set($TempSum)//o)"/>

    </xsl:template>

    <xsl:template match="Kunde" mode="OrderLine">
        <xsl:value-of select="Ordre/ProduktId"/>, <xsl:value-of select="Ordre/SalgsDato"/>, <xsl:value-of select="Ordre/Pris"/>
        <br></br>
    </xsl:template>


Tadaaa husk du kan sortere under hver <xsl:apply-template><xsl:sort/></xsl:template>

Hvis du skal have noget dato sortering på..

Ændre jeg en vare til at koste 60000 virker det stadig her, hvordan får jeg det "numbers" problem ?

/J
Avatar billede jokkejensen Novice
18. maj 2010 - 13:00 #37
<xsl:template match="Kunder">
        <xsl:apply-templates select="Kunde[not(Navn=preceding-sibling::Kunde/Navn)]" mode="OrderHead" />
    </xsl:template>
   
    <xsl:template match="Kunde" mode="OrderHead">
        <br></br>
        <xsl:variable name="Navn" select="Navn"></xsl:variable>
        <h1>
            <xsl:value-of select="$Navn"/>
        </h1>
        <h2>
            Ordrer:
        </h2>
        <xsl:apply-templates select="/Kunder/Kunde[not(Ordrenr=preceding-sibling::Kunde[$Navn = Navn]/Ordrenr) and $Navn = Navn]" mode="Orders">
            <xsl:with-param name="Navn" select="$Navn"/>
        </xsl:apply-templates>
        <xsl:variable name="TempSum">
            <pris>
                <xsl:for-each select="/Kunder/Kunde/Ordre//Pris[../../Navn = $Navn]">
                    <o>
                        <xsl:value-of select="translate(., ',', '.')"/>
                    </o>
                </xsl:for-each>
            </pris>
        </xsl:variable>
        <br></br>
        total sum : <xsl:value-of select="sum(msxml:node-set($TempSum)//o)"/><br></br>
    </xsl:template>

    <xsl:template match="Kunde" mode="Orders">
        <xsl:param name="Navn"></xsl:param>
        <xsl:variable name="Ordrenr" select="Ordrenr"></xsl:variable>   
            <h3>
                <xsl:value-of select="$Ordrenr"/>:
            </h3>
            <xsl:apply-templates select="//Kunde[Ordrenr = $Ordrenr and $Navn = Navn]" mode="OrderLine"></xsl:apply-templates>
            <xsl:variable name="TempSum">
                <pris>
                    <xsl:for-each select="/Kunder/Kunde/Ordre//Pris[../../Ordrenr = $Ordrenr and ../../Navn = $Navn]">
                        <o>
                            <xsl:value-of select="translate(., ',', '.')"/>
                        </o>
                    </xsl:for-each>
                </pris>
            </xsl:variable>
            order sum:    <xsl:value-of select="sum(msxml:node-set($TempSum)//o)"/>

    </xsl:template>

    <xsl:template match="Kunde" mode="OrderLine">
        <xsl:value-of select="Ordre/ProduktId"/>, <xsl:value-of select="Ordre/SalgsDato"/>, <xsl:value-of select="Ordre/Pris"/>
        <br></br>
    </xsl:template>
Avatar billede CodingJoe Nybegynder
18. maj 2010 - 13:34 #38
Wow var lige væk...ja, jeg fik nogle problemer med NaN i ialt, jeg har efterfølgende flyttet data over i et regneark og lagt kollonnen sammen, og kunne konstatere at det blev over 50k...så jeg tænkte det måske var max værdien af number, jeg havde ramt...jeg tester lige.. :)
Avatar billede jokkejensen Novice
18. maj 2010 - 13:49 #39
Narj det tror jeg ikke, vurder lige om dit data er korrekt, jeg formoder at det bare er XXXXXXXX,XX formatet er..

Kommer der nogle med ex : XXX.XXX,XX vil det fejle ?

Vh.
Avatar billede CodingJoe Nybegynder
18. maj 2010 - 13:59 #40
DING DING DING....
Succes...

Det virker...damn du er en xslt wizz...det med tallene er nok et andet problem...har selv lige prøvet med min egen lille simpliceret xml....det er nok data, der er noget galt med...

Wow...hvordan har du lært alt det her xslt...jeg er nu mest til serverside programmering :S
Avatar billede CodingJoe Nybegynder
18. maj 2010 - 13:59 #41
Formatet jeg skriver resultaterne nu i ->
format-number(sum(msxml:node-set($TempSum)//o), '#.##')
Avatar billede jokkejensen Novice
18. maj 2010 - 15:06 #42
Smid den her i toppen :)

<xsl:decimal-format name="DKK" decimal-separator="," grouping-separator="."/>

og brug

format-number(sum(msxml:node-set($TempSum)//o), '###.###', 'DKK')

Jeg arbejder til dagligt med xslt, får xml fra alle tænkelige steder, så har lidt erfaring efter 4-5 år.. Lidt stejl indlæringskurve, men der er SLET ikke ret langt til toppen, redskaberne er utroligt simple, så det er ofte kun xpath der er problemet.
Avatar billede CodingJoe Nybegynder
18. maj 2010 - 20:40 #43
Det hjalp...nu bliver alle tallene lagt fint sammen....mange tak for en yderst kompetent xslt "rådgivning".

You are the man!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester