Guide

Arkeologisk XSLT : Frem fra glemselen (del 2)

La oss komme tilbake til vårt opprinnelige problem. Jeg fiklet med koden i et par minutter eller så (utviklingstid er, som vi alle vet, relativ). Begge (eller snarere, alle fire!) filene var vedlikeholdt for hånd, så jeg bestemte meg for ikke bare å skrive om hele XSLT-en men også restrukturere XML-en også. Tro meg, jeg handlet i nødverge!

- XML, episode 4 : Et nytt håp

Først endret jeg XML strukturen:

 <guides>
     <heading>Guides</heading>
     <description>[snip]</description>

Borte er alle elementer med store bokstaver. Dette er nødvendigvis ikke noe stort poeng, men det kan ofte være at du må gjenskape semantiske likheter på tvers av plattformer, og plutselig har du Java eller C# klassen 'FastBeaver' og instanser som 'reallyFastBeaver'. Du veit aldri. Deretter:

<!-- Our subjects; choose a different label if the presentation needs to look different -->
 <index-presentation>
     <subject name="Maps">Maps</subject>
     <subject name="Manuscripts">Manuscripts</subject>
     <format name="Bibliography">Bibliographies</format>
     <format name="Collection Guide">Collection Guides</format>
     <format name="Discover Guide">Discover Guides</format>
 </index-presentation>

Ok, jeg innrømmer det: Jeg kunne ha puttet presentasjonsrelaterte elementer i en annen fil, men for enkelhets skyld (og fordi de er semantisk klarert og klart separert) puttet jeg de inn i toppen av filen. Så jeg er en pragmatist. Uff da.

Deretter konverterte jeg alle data inn i en semantisk rikere og enklere struktur, og uten antyding til grupperinger;

<record>
     <title>Aerial Photographs</title>
     <description>[snip]</description>
     <url>../../map/aerialphoto.html</url>
     <subject>Maps</subject>
     <format>Collection Guide</format>
 </record>

La meg først peke ut relasjonen mellom /guides/index-presentation/format/@name 'CollectionGuide' og /guides/record/format 'CollectionGuide'; hver <record> har potensielle <subject> og <format> elementer som vi vil sortere og gruppere etter. Husk at vi hadde to XSLT-er, èn for hver type gruppering. En av de viktigste grunnene til å skrive om all kode er at gruppering skal kunne skje automatisk.

Ingen av disse <record> elementene er nå sortert i XML-fila, og de kan puttes inn og flyttes hvor du vil. Det var den andre viktige grunnen til omskrivningen av koden - sortering kan også skje automatisk.

Her er en påminner fra gamle <topiclist> dager:

 <TOPICLIST>
     <TOPICNAME>Miscellaneous</TOPICNAME>
     <BOOKMARK>misc</BOOKMARK>
 </TOPICLIST>

Vær oppmerksom på <BOOKMARK> elementet som nå er borte i det nye skjemaet. Denne ble brukt til å lage lenker og ankere til grupperinger, men siden disse grupperingene nå skjer automagisk er <BOOKMARK> automagisk borte. Istedet bruker vi enkel filtrering for å gjøre navn om til URL-vennlige ankerpunkter. Dette betyr at hvis du vil legge til en ny gruppe så, eh, legger du bare til en ny gruppe der du trenger den. Resten er magi.

En rask sjekk forteller oss at XML-fila datt fra 1837 linjer ned til 890 linjer. Det er jo en god start med tanke på at de eksakt samme grunndata er bevart. Men la oss se hva som kan gjøres for XSLT-en.

Først, en parameter som vil være avgjørende for XSLT-ens liv og mening:

 <!-- Parameter in; 'sort' is either 'subjects' or 'formats'   -->
 <xsl:param name="sort" select="'subjects'" />

Parameteren 'sort' (sorter)  er, som XML-kommentaren sier, enten 'subjects' eller 'formats', som mer eller mindre taler for seg selv. Hvis ingen velges vil 'subjects' autmatisk bli valgt. Det betyr at vi nå kan gjøre som følger:

<xsl:choose>
     <xsl:when test="$sort='subjects'">
         <xsl:call-template name="html.create.bookmarks">
             <xsl:with-param name="sort.by" select="$group.subjects" />
         </xsl:call-template>
     </xsl:when>
     <xsl:when test="$sort='formats'">
         <xsl:call-template name="html.create.bookmarks">
             <xsl:with-param name="sort.by" select="$group.formats" />
         </xsl:call-template>
     </xsl:when>
 </xsl:choose>

Vi kaller opp malen 'html.create.bookmarks' med parameteren 'sort.by' med verdien enten '$group.subjects' eller '$group.formats'. La oss ta en titt på hvordan vi lagde variabelen '$group.subjects' i begynnelsen av XSLT-en, for der ligger hemmeligheten til alt!

Kommentarer (1)

Norges beste mobilabonnement

Mars 2017

Kåret av Tek-redaksjonen

Jeg bruker lite data:

Komplett MiniFlex 1GB


Jeg bruker middels mye data:

Telio FriBruk 5GB+EU


Jeg bruker mye data:

Komplett MaxiFlex 10GB


Jeg er superbruker:

Komplett MegaFlex 30GB


Finn billigste abonnement i vår mobilkalkulator

Forsiden akkurat nå

Til toppen