11. maj 2010 - 17:43Der 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).
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:
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.
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.
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.
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" />
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.
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:
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.
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. :)
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.
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 ?
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.. :)
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
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.
Det hjalp...nu bliver alle tallene lagt fint sammen....mange tak for en yderst kompetent xslt "rådgivning".
You are the man!
Synes godt om
Ny brugerNybegynder
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.