---
title: "Gebruik de ingebouwde XPath-functies"
date: "2011-07-12"
categories: 
  - "xpath"
tags: 
  - "altova-online-training"
  - "altova-xmlspy"
  - "data-mapping"
  - "education"
  - "learn-xml"
  - "xml-editor"
  - "xmlspy"
  - "xpath"
  - "xslt"
description: Dit artikel onderzoekt het gebruik van XPath-functies om XML-gegevens efficiënt te sorteren, met de nadruk op het extraheren van achternamen en het verwerken van voorvoegsels in titels.
---
Status: #blog

Tags:  #altova-online-training #altova-xmlspy #data-mapping #education #learn-xml #xml-editor #xmlspy #xpath #xslt

Categories: [xpath+xquery](/blog/nl/category/xpathxquery.md)
# Gebruik de ingebouwde XPath-functies

Bij het ontwikkelen van een van de [Altova Online Training](https://www.altova.com/nl/aot/online-training.aspx) cursussen, heb ik een lijst met boeken gesorteerd op basis van de auteurs. Ik merkte dat het veld met de auteur een string bevatte met de volledige naam van de auteur, waardoor de boeken werden gesorteerd op de eerste letter van die string, oftewel de voornaam van de auteur. Het was niet mogelijk om de sorteerfunctie aan te passen binnen de cursus, maar u kunt eenvoudig de achternaam uit een string halen en deze gebruiken als sorteersleutel met behulp van XPath-functies. Als u vervolgens de titels van de boeken gebruikt als een secundaire sorteersleutel, krijgt u een probleem met titels die beginnen met "A", "An" of "The". Ik wil de titel gebruiken als secundaire sorteersleutel, maar de voorvoegsels "een", "een" of "de" negeren.

![Geef de lijst met boeken weer, waarbij de sorteervolgorde is gecorrigeerd met behulp van XPath-expressies](https://lh4.ggpht.com/-OBe9_xfjlpQ/TgD1tUSi6sI/AAAAAAAAAGw/nLwMwUDQTJ4/correct-sort-xsl2_thumb%25255B2%25255D.png?imgmax=800) 

Laten we eens kijken hoe we deze XSLT-code hebben gemaakt. Dit artikel is geschreven met behulp van [XMLSpy](https://www.altova.com/nl/xmlspy.html) als platform, maar dezelfde XPath-expressies kunnen ook in [MapForce](https://www.altova.com/nl/mapforce.html) of [StyleVision](https://www.altova.com/nl/stylevision.html) worden gebruikt om vergelijkbare resultaten te bereiken. We kunnen beginnen met een eenvoudige XML-lijst van boeken. We hebben 4 boeken met auteurs- en titelnodes. 

[![Lijst van drie boeken](https://lh5.ggpht.com/-oP0T7tap1j8/TgD1qZFjeJI/AAAAAAAAAGI/Q9N1sefXpr8/book-list-xml2_thumb%25255B6%25255D.png?imgmax=800 "book_list.xml")](http://lh5.ggpht.com/-1XkQTBtjxgI/TgD1p7e9jRI/AAAAAAAAAGE/r5x-fYqrXB4/s1600-h/book-list-xml2%25255B8%25255D.png) 

Een XSLT-transformatie om een lijst van boeken te genereren, zou er als volgt uitzien:

[![Geef de lijst met boeken weer, zonder enige sorteervolgorde](https://lh6.ggpht.com/-Xl2drxDYvWk/TgD1qyCS-tI/AAAAAAAAAGQ/XtlE-ha3aPY/no-sort-xsl2_thumb%25255B3%25255D.png?imgmax=800 "no_sort.xsl")](http://lh6.ggpht.com/-0QjJb5fadso/TgD1qitzcrI/AAAAAAAAAGM/ENp-px5_e1g/s1600-h/no-sort-xsl2%25255B7%25255D.png) 

Dit genereert het volgende resultaat: 

[![Ongesorteerde lijst van boeken](https://lh4.ggpht.com/-84ZeFnOVnX0/TgD1ruHFFII/AAAAAAAAAGY/rtui-dgtCUQ/no-sort-output_thumb%25255B2%25255D.png?imgmax=800 "Output from XSL with No Sort")](http://lh6.ggpht.com/-DcGmqHHaQi4/TgD1rJWB_GI/AAAAAAAAAGU/V9i4088XoKs/s1600-h/no-sort-output%25255B4%25255D.png) 

De boeken worden in de volgorde weergegeven zoals ze voorkomen in het oorspronkelijke databestand. Als we `xsl:sort` toevoegen aan de `xsl:for-each`-lus, kunnen we de weergave op andere manieren ordenen. 

[![Geef de lijst met boeken weer, gesorteerd op een eenvoudige manier](https://lh4.ggpht.com/-JX9qbo9fYjo/TgD1sKu_YVI/AAAAAAAAAGg/rtHXnh_x94o/sort-xsl2_thumb%25255B2%25255D.png?imgmax=800 "sort.xsl")](http://lh4.ggpht.com/-WEIuCC1NRNw/TgD1rzIgzPI/AAAAAAAAAGc/q79Va9UWMgo/s1600-h/sort-xsl2%25255B4%25255D.png) 

Dit genereert een gesorteerde lijst, maar niet op de juiste manier. 

[![Uitvoer van XSL met basis sorteerfunctie](https://lh3.ggpht.com/-kN0aSY1DhE8/TgD1spmsmLI/AAAAAAAAAGo/BsxQW6XYwWk/sort-output_thumb%25255B2%25255D.png?imgmax=800 "Output from XSL with Basic Sort")](http://lh3.ggpht.com/-2JAA_7dIt4o/TgD1sYIFl-I/AAAAAAAAAGk/M5g2B1vVC_M/s1600-h/sort-output%25255B4%25255D.png) 

Het sorteren van auteurs als een string resulteert erin dat "Jules Verne" vóór "Mark Twain" verschijnt. Ook verschijnt "A Connecticut Yankee in King Arthur’s Court" vóór "Adventures of Huckleberry Finn". We willen het onbepaalde lidwoord "A" negeren, zodat "Adventures of Huckleberry Finn" vóór "A Connecticut Yankee in King Arthur’s Court" verschijnt. We kunnen XPath-expressies gebruiken om de sorteersleutels te extraheren die we willen. 

[![Geef de lijst met boeken weer, waarbij de sorteervolgorde is gecorrigeerd met behulp van XPath-expressies](https://lh4.ggpht.com/-OBe9_xfjlpQ/TgD1tUSi6sI/AAAAAAAAAGw/nLwMwUDQTJ4/correct-sort-xsl2_thumb%25255B2%25255D.png?imgmax=800 "correct_sort.xsl")](http://lh4.ggpht.com/-1797dSMl6G0/TgD1tIvfZnI/AAAAAAAAAGs/G8i7ztztp9Y/s1600-h/correct-sort-xsl2%25255B4%25255D.png) 

Laten we de code bekijken voordat we naar de uitvoer kijken. We vervangen "author" door "reverse(tokenize(author, ' '))[1]". De functie "tokenize" verdeelt de auteurstring in afzonderlijke delen, waarbij een enkele spatie als scheidingsteken wordt gebruikt. Dus "Jules Verne" wordt getokenized in "Jules" en "Verne". De functie "reverse" keert de volgorde van deze delen om, waardoor we "Verne" en "Jules" krijgen. Het deel tussen de vierkante haken selecteert het eerste item in de lijst, namelijk "Verne". Dit is de waarde die wordt gebruikt in de functie "xsl:sort" om de boeken te ordenen. Dit is niet de perfecte oplossing, maar het werkt in ons geval. De titel lijkt ingewikkeld, maar de logica is eenvoudig. De expressie "tokenize(title, ' ')[1]" haalt het eerste woord van de titel op. Dus, de eerste "if"-test is: "Is het eerste woord van de titel het woord 'A'?" Als dat zo is, dan retourneren we het deel van de titel dat begint met de derde letter, waardoor we "A" en de spatie verwijderen. Als het eerste woord van de titel niet "A" is, dan moeten we het opnieuw testen om te zien of het eerste woord van de titel "The" is. Als dat zo is, dan gebruiken we het deel van de titel dat begint met het vijfde teken, waardoor we "The" en een spatie verwijderen. Als beide tests falen, dan geven we de titel simpelweg door als sorteersleutel. We zouden een extra test aan onze code kunnen toevoegen om te zien of het eerste woord "An" is, maar dat is niet nodig voor deze dataset. Door deze laatste XSLT-transformatie uit te voeren, krijgen we de volgende uitvoer. 

[![Uitvoer van XSL met gecorrigeerde sorteerfunctie](https://lh5.ggpht.com/-78G5M2Z81Ow/TgD1uRmfiQI/AAAAAAAAAG4/YStPJ1HRDj0/correct-sort-output_thumb%25255B2%25255D.png?imgmax=800 "Output from XSL with Corrected Sort")](http://lh3.ggpht.com/-h5AD7I5C60o/TgD1tsVI9fI/AAAAAAAAAG0/Nj8_cO10i2s/s1600-h/correct-sort-output%25255B4%25255D.png) 

"Mark Twain" staat nu voor "Jules Verne". "The Adventures of Huckleberry Finn" verschijnt voor "The Celebrated Jumping Frog of Calaveras County" en "A Connecticut Yankee in King Arthur's Court". Het probleem met onze aanpak van de auteurstring is dat we willen dat "Jules Verne" wordt behandeld als "Verne, Jules" bij het sorteren, zodat als we een boek van "Jimmy Verne" hebben, deze als een andere auteur wordt beschouwd. Onze code doet dat niet. Het gebruik van "concat(reverse(tokenize(author, ' '))[1], reverse(tokenize(author, ' '))[2])" zou "Jules Verne" en "Jimmy Verne" correct sorteren, maar deze oplossing werkt alleen met namen van twee woorden. Als een auteur een toevoeging heeft ("Martin Luther King, Jr.") of meerdere woorden ("George Herbert Walker Bush"), dan zou de code falen. Er zijn veel uitzonderingen op de algemene regels voor het alfabetisch sorteren van namen, en de code die alle varianten zou toestaan, zou ver buiten het bestek van dit artikel vallen. Wat we wilden aantonen, is de mogelijkheid om XML-gegevens dynamisch te manipuleren met behulp van XPath-expressies. We hebben niet altijd volledige controle over het formaat van onze gegevensbronnen, maar met de kracht van XPath-expressies kunnen we de gegevens transformeren naar het gewenste formaat. Een kopie van de bestanden die in deze voorbeelden zijn gebruikt, is beschikbaar [hier](https://www.altova.com/nl/library/Using_XPath_Functions.zip).
