Oprettet tir. d. 11. maj 2010 kl. 17:43:24

CodingJoe
CodingJoe (2.075 point. Point ude: 85)

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? :)

Skrevet tir. d. 11. maj 2010 kl. 17:52:59| #1

CodingJoe
CodingJoe (2.075 point)
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
...
...
...

Skrevet tir. d. 11. maj 2010 kl. 21:30:05| #2

CodingJoe
CodingJoe (2.075 point)
lille fejl i xml strukturen 'AssNavn' = 'Navn'.

Skrevet ons. d. 12. maj 2010 kl. 16:49:53| #3

jokkejensen
jokkejensen (36.240 point)
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

Skrevet man. d. 17. maj 2010 kl. 00:41:01| #4

CodingJoe
CodingJoe (2.075 point)
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.

Skrevet man. d. 17. maj 2010 kl. 06:09:55| #5

jokkejensen
jokkejensen (36.240 point)
ja, så lige at du også vil have dem grupperet efter ordre, sig til hvis det driller.

Skrevet man. d. 17. maj 2010 kl. 09:00:50| #6

CodingJoe
CodingJoe (2.075 point)
Jeps. Jeg skriver lige, hvis det driller...XSLT er ikke min stærke side :S

Skrevet man. d. 17. maj 2010 kl. 09:10:19| #7

CodingJoe
CodingJoe (2.075 point)
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. :(

Skrevet man. d. 17. maj 2010 kl. 09:15:55| #8

jokkejensen
jokkejensen (36.240 point)
xmlns:msxml="urn:schemas-microsoft-com:xslt"

Skrevet man. d. 17. maj 2010 kl. 09:27:07| #9

CodingJoe
CodingJoe (2.075 point)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/ (...)
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...

Skrevet man. d. 17. maj 2010 kl. 09:32:28| #10

jokkejensen
jokkejensen (36.240 point)
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

Skrevet man. d. 17. maj 2010 kl. 09:35:23| #11

jokkejensen
jokkejensen (36.240 point)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
    <!ENTITY nbsp "&#x00A0;">
]>
<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/ (...)
    xmlns:msxml="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxml">

Skrevet man. d. 17. maj 2010 kl. 09:36:02| #12

jokkejensen
jokkejensen (36.240 point)
msxml er afhængigt af miljø, hvis det ikke er en windows box, skal du nok finde et alternativ.

Skrevet man. d. 17. maj 2010 kl. 09:36:09| #13

CodingJoe
CodingJoe (2.075 point)
Jeg fik det til at virke....

Skrevet man. d. 17. maj 2010 kl. 09:38:13| #14

CodingJoe
CodingJoe (2.075 point)
Jeg prøver lige at gruppere informationer efter ordre...håber ikke jeg starter endnu et hæsblæsende xslt kodning forsøg :S

Skrevet man. d. 17. maj 2010 kl. 09:55:04| #15

CodingJoe
CodingJoe (2.075 point)
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. :)

Skrevet man. d. 17. maj 2010 kl. 10:02:24| #16

jokkejensen
jokkejensen (36.240 point)
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

Skrevet man. d. 17. maj 2010 kl. 10:54:30| #17

CodingJoe
CodingJoe (2.075 point)
Ja, fandt ud af det bagefter :S

XSLT er vist ikke mig....

Skrevet man. d. 17. maj 2010 kl. 11:30:19| #18

jokkejensen
jokkejensen (36.240 point)
du siger bare til hvis jeg skal gruppere de ordrer også..

Skrevet man. d. 17. maj 2010 kl. 12:25:18| #19

CodingJoe
CodingJoe (2.075 point)
Du må gerne give det et shot :)

Skrevet man. d. 17. maj 2010 kl. 14:16:25| #20

jokkejensen
jokkejensen (36.240 point)
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>

Skrevet man. d. 17. maj 2010 kl. 14:17:29| #21

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

Glemte lige den :)

Skrevet man. d. 17. maj 2010 kl. 15:21:39| #22

CodingJoe
CodingJoe (2.075 point)
Tusinde tak ....jeg prøver...din hjælp har allerede være god. :)

Skrevet tir. d. 18. maj 2010 kl. 10:46:33| #23

CodingJoe
CodingJoe (2.075 point)
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" />

Skrevet tir. d. 18. maj 2010 kl. 10:48:40| #24

CodingJoe
CodingJoe (2.075 point)
Reglen er: Så længe Kundenavn er forskellig, så skal ordrenr ikke grupperes for dem som een.

Skrevet tir. d. 18. maj 2010 kl. 10:53:31| #25

jokkejensen
jokkejensen (36.240 point)
Altså ordrenr er ikke uniqt men en sammensat nøgle af ordrenummer og kundenavn ?

Skrevet tir. d. 18. maj 2010 kl. 10:54:23| #26

jokkejensen
jokkejensen (36.240 point)
<xsl:apply-templates select="/Kunder//Kunde[Navn = $Navn]" mode="Orders" />

Skrevet tir. d. 18. maj 2010 kl. 11:00:25| #27

CodingJoe
CodingJoe (2.075 point)
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.

Skrevet tir. d. 18. maj 2010 kl. 11:10:35| #28

CodingJoe
CodingJoe (2.075 point)
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.

Skrevet tir. d. 18. maj 2010 kl. 11:18:47| #29

CodingJoe
CodingJoe (2.075 point)
Rækkefølgen vil altid være at dem med ens odrenr vil komme i forlængelse.

Skrevet tir. d. 18. maj 2010 kl. 11:20:10| #30

CodingJoe
CodingJoe (2.075 point)
Som sagt så er beregnignen god nok....data bliver bare ikke vist :)

Skrevet tir. d. 18. maj 2010 kl. 11:38:59| #31

jokkejensen
jokkejensen (36.240 point)
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.

Skrevet tir. d. 18. maj 2010 kl. 11:50:56| #32

CodingJoe
CodingJoe (2.075 point)
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. :)

Skrevet tir. d. 18. maj 2010 kl. 12:30:51| #33

CodingJoe
CodingJoe (2.075 point)
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 :(

Skrevet tir. d. 18. maj 2010 kl. 12:52:51| #34

jokkejensen
jokkejensen (36.240 point)
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 ?

Skrevet tir. d. 18. maj 2010 kl. 12:56:22| #35

jokkejensen
jokkejensen (36.240 point)
how nej, den tager sku en forkert ordre... hold on

Skrevet tir. d. 18. maj 2010 kl. 13:00:04| #36

jokkejensen
jokkejensen (36.240 point)
<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

Skrevet tir. d. 18. maj 2010 kl. 13:00:33| #37

jokkejensen
jokkejensen (36.240 point)
<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>

Skrevet tir. d. 18. maj 2010 kl. 13:34:00| #38

CodingJoe
CodingJoe (2.075 point)
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.. :)

Skrevet tir. d. 18. maj 2010 kl. 13:49:18| #39

jokkejensen
jokkejensen (36.240 point)
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.

Skrevet tir. d. 18. maj 2010 kl. 13:59:04| #40

CodingJoe
CodingJoe (2.075 point)
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

Skrevet tir. d. 18. maj 2010 kl. 13:59:58| #41

CodingJoe
CodingJoe (2.075 point)
Formatet jeg skriver resultaterne nu i ->
format-number(sum(msxml:node-set($TempSum)//o), '#.##')

Skrevet tir. d. 18. maj 2010 kl. 15:06:36| #42

jokkejensen
jokkejensen (36.240 point)
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.

Skrevet tir. d. 18. maj 2010 kl. 20:40:23| #43

CodingJoe
CodingJoe (2.075 point)
Det hjalp...nu bliver alle tallene lagt fint sammen....mange tak for en yderst kompetent xslt "rådgivning".

You are the man!

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

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


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

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


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