[XSLT] Custom sorting

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil bepaalde objecten die binnenkomen (als XML) m.b.v. XSLT sorteren op een bepaalde voorgedefinieerde manier. Nu kun je een xsl:sort gebruiken, alleen deze heeft weinig mogelijkheden tot custom sorting. Hieronder een stukje code dat het probleem moet verduidelijken. De gebruikte namen zijn als voorbeeld:

code:
1
2
3
4
5
6
7
<xsl:stylesheet>
     <xsl:for-each select="Adres">
          <Straat>
               <Huisnummer>xx</Huisnummer>
          </Straat>
     </xsl:for-each>
</xsl:stylesheet>

Het huisnummer xx kan de volgende waardes hebben: 40, 50, 60 of 85.
Alle adressen moeten gesorteerd worden op huisnummer en wel in deze volgorde: 50, 40, 60, 85

Stel er zitten 4 adressen in de XML, hoe krijg ik ze dan gesorteerd in de gewenste volgorde? Met xsl:sort krijg je alleen 40, 50, 60, 85 of 85, 60, 50, 40 voor elkaar.

Acties:
  • 0 Henk 'm!

  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 20:34

Peetman

Tjah....

Bedoel je dat je eerst op straat en dan op huisnummer wil sorteren? Want de sorteervolgorde die je nu aangeeft lijkt me sowieso praktisch onmogelijk in bijna elke programmeertaal.

In het eerste geval kan je gewoon gebruikmaken van meerdere sort statements achter elkaar. Dus eerst op adres en dan op huisnummer.

[ Voor 27% gewijzigd door Peetman op 27-07-2009 09:30 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De adres objecten moeten alleen op huisnummer gesorteerd worden en specifiek in die volgorde. Zoiets moet toch wel kunnen met XSLT?

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Dat is toch geen volgorde :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 20:34

Peetman

Tjah....

Verwijderd schreef op maandag 27 juli 2009 @ 09:39:
De adres objecten moeten alleen op huisnummer gesorteerd worden en specifiek in die volgorde. Zoiets moet toch wel kunnen met XSLT?
Het kan wel via bijv extension methods, maar dat hangt erg af van je xslt engine.

En voor de rest met ^^^^^^

[ Voor 4% gewijzigd door Peetman op 27-07-2009 10:05 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Tja, ik heb die volgorde ook niet verzonnen. Een derde partij vereist zo'n gesorteerde xml. Zoals het nu lijkt kun je met xslt 1.0 dit niet doen...

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Hoe zou je het sorteren dan via een database doen? Parsers zoals SQL- en XPATH engines kunnen alleen op een logische manier sorteren. Echter kan ik geen logische verloop vinden in de reeks 50, 40, 60, 85.

Waarom voeg je via de applicatie niet een extra attribute (sortorder) toe aan de xml welke de juiste volgorde aangeeft?

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik krijg XML aangelevert van partij A en moet deze na sorteren sturen naar partij B. Een attribuut sortorder toevoegen gaat helaas niet, anders had ik dat wel al gedaan. Ik ga wel kijken of het toch niet op een omslachtige manier kan, want het moet wel gebeuren.

Dank voor de input.

Acties:
  • 0 Henk 'm!

  • Wolly
  • Registratie: Januari 2001
  • Niet online
Dus je wilt eerst de tientallen aflopend sorteren, en daarna de rest (ook aflopend?)

Kan je dan niet met een if huisnr mod 0 constructie spelen voor de eerste, en huisnummer mod != 0 voor de tweede?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De huisnummers die je ziet zijn puur als voorbeeld. Er zit wel een vaste volgorde in (die dus random lijkt).

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik zou, voor ik er ook maar 1 minuut werk in zou steken, eerst eens even die partijen met de koppen tegen mekaar knallen waarom ze zo'n vage "sortering" hanteren en dan mogen ze toch met een verdomde goede reden voor ik er verder naar zou kijken. Waarschijnlijk is je probleem non-existent.

[ Voor 8% gewijzigd door RobIII op 27-07-2009 11:18 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Verwijderd schreef op maandag 27 juli 2009 @ 10:43:
Ik krijg XML aangelevert van partij A en moet deze na sorteren sturen naar partij B. Een attribuut sortorder toevoegen gaat helaas niet, anders had ik dat wel al gedaan. Ik ga wel kijken of het toch niet op een omslachtige manier kan, want het moet wel gebeuren.

Dank voor de input.
Als je de XML krijgt aangeleverd, dan kun je toch ook gewoon met een parser alvast de sortering uitvoeren en zelf een attribute in de XML toevoegen. Over die XML wordt dan de XSL uitgevoerd welke XML oplevert welke je naar partij B stuurt.

Echter zit jij tussen partij A en B (man in the middle) en kun je dus ook gewoon de informatie manipuleren.

Je kunt middels een SelectNodes alle relevante nodes ophalen en deze in een collectie plaatsen. .NET heeft bijvoorbeeld de mogelijk om custom compares te maken. Volgens laat je de collectie middels de custom sorteer functie sorteren en daarna doorloop je sequentieel alle nodes uit de collectie en kun je simpel een attribute toevoegen.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
public class HuisnummerComparer : IComparer<XmlElement>
{
  //implement custom sort 
}


XmlNodeList nodeList = xml.SelectNodes("//Adres/Huisnummer");
List<XmlElement> nodes = new List<XmlElement>(nodeList.AsQueryAble());
nodes.Sort(new HuisnummerComparer());

for(int i = 0; i < nodes.Count; i++)
   nodes[i].SetAttribute("sortOrder", i.ToString());

Ik gebruik hier specifiek XmlElement in plaats van XmlNode omdat je dan gemakkelijker de attribute van een node kunt benaderen.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Je wilt dus eigenlijk sorteren op abs(huisnummer-49)? 50, 40, 60, 85 wordt dan 1, 9, 11, 36 en dat is wel een logische volgorde. In principe kan dat gewoon met XSLT, het is alleen nogal vreemd... :)
To sort on absolute numeric value:

In XSLT 2.0 use

<xsl:sort select="abs(XXX)"/>

In XSLT 1.0 use

<xsl:sort select="translate(XXX, '-' '')" data-type="number"/>

[ Voor 40% gewijzigd door pedorus op 28-07-2009 00:19 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1