Glitre

5.08.2010

Sortering med XSLT

Filed under: MARC,NORMARC,Sortering — magnusenger @ 14:41

Sortering med XSLT er nå implementert. Antagelig vil det trenges litt finpuss på fjerning av tegn fra årstall* osv, men den grunnleggende funksjonaliteten er på plass.

Kommentarer fra Twitter tyder på at andre mener det vil være raskere å implementere sorteringen i PHP (dvs plukke data fra postene og legge dem i array i PHP, sortere arrayene og så sette sammen postene i ny rekkefølge basert på denne sorteringen), men i første omgang nøyer vi oss med den nå værende løsningen. Dersom det blir tid til det senere i prosjektet kan vi komme tilbake til saken og prøve å implementere sorteringen på den foreslåtte måten. Da blir det både mulig å gjøre tester av hurtigheten til de to metodene, og tilby begge som konfigurerbare alternativer i Glitre.

* Årstall i MARC-poster er et glitrende eksempel på at de «maskinlesbare» dataene i MARC langt fra er så maskinlesbare som de burde ha vært:

I følge NORMARC inneholder 260$a «År. Dette er utgivelsesår, produksjonsår eller copyrightår.». Allerede her ser vi et problem. Vi har et årstall, men vi vet ikke egentlig hva årstallet representerer. Dette burde egentlig vært tre adskilte felt, eller det burde vært et ekstra felt/indikator som fortalte akkurat hva slags felt det egentlig er snakk om.

Et annet problem er at feltet ofte ikke inneholder rene årstall. Tilfeldige stikkprøver har avslørt følgende varianter:

  • [2003?]
  • [200-?]
  • pp1992
  • [2004]

Hvordan skal man kunne sortere disse på en fornuftig måte? Jo, man blir nødt til å skrelle bort de ekstra tegnene etter beste evne. Glitre har foreløpig løst dette på følgende vis:

<xsl:sort select="translate(datafield[@tag=260]/subfield[@code='c'], 'cop.[]', '')" data-type="text" order="{$sortOrder}"/>

Dette innebærer at alle forekomster av tegnene «cop.[]» i 260$c fjernes før sorteringen gjøres. Dersom MARC skulle vært virkelig maskinlesbart burde feltet inneholdt kun et rent årstall, og de opplysningene som de ekstra tegnene representerer burde vært kodet ved help av andre delfelt.

4.08.2010

Hvordan sortere MARC-poster?

Filed under: NORMARC,Sortering — magnusenger @ 15:59

Som tidligere nevnt har Glitre konkludert med at sortering må implementeres i Glitre, det er ikke mulig å basere seg på sortering på tjenerne som søkeresultatene hentes fra. Basert på tidligere erfaringer fra Pode er det (minst) to måter å gjøre dette på:

  • I Podes reiseplanlegger ble sorteringen gjort ved help av <xsl:sort>, før XSLT ble benyttet til videre bearbeiding av postene i MARCXML-format.
  • I Podes musikkmashup ble sorteringen gjort ved hjelp av array i PHP. Elementene det skulle sorteres på (tittel, forfatter osv) ble plukket ut av postene og brukt som nøkler i array som så ble sortert, før videre bearbeiding av postene.

Glitre vil i første omgang satse på å sortere med XSLT, dels fordi det vil være det mest elegante, dels fordi rå MARC-data skal være et av mange mulige ut-formater fra Glitre, og XSLT vil forhåpentligvis gjøre dette mulig uten at man trenger å plukke postene fra hverandre og så sette dem sammen igjen.

Blogg på WordPress.com.