Appunti di XSL-T

Post “just for me”.

Alcuni esempi di xsl che ho usato ultimamente e vorrei ricordarmi per il futuro (qualora servissero ad altri, meglio).

Generare più file da un unico xml

Usare result-document, ad esempio se in una topic maps voglio generare un file html per ogni pagina salvandolo nella directory tm

<!-- variabile per il nome della directory -->
<xsl:variable name="output_dir">tm</xsl:variable>
<!-- per ogni topic creo un file che ha come nome id del topic -->
<xsl:for-each select="topic">
    <xsl:result-document href="{$output_dir}/{@id}.html" method="html">
        <html>
             <!-- tutto il resto della trasformazione -->
        </html>
    </xsl:result-document>
</xsl:for-each>

Accedere a un documento esterno e elaborarlo

Per questo basta la funzione doc. Ad esempio, supponendo di avere un record MODS con l’autore ( <name> ) collegato (con xlink) a un record EAC

<!-- variabile che assume il valore di xlink:href si suppone di essere già nell'elemento name-->
<xsl:variable name="id_person" select="@xlink:href"/>
<!-- applico il template eac, richiamando un file xml esterno e passando id_person come parametro -->
<xsl:apply-templates select="doc($id_person)/eac">
    <xsl:with-param name="id_person" select="$id_person"/>
 </xsl:apply-templates>

Raggruppare e deduplicare

Se, nello stesso caso di prima volessi raggruppare tutti gli autori prima di processare le relative schede eac in modo da evitare di processare due volte lo stesso autore:

<!-- raggruppo per xlink:href, assumendo, in questo caso di essere all'interno di modsCollection -->
<xsl:for-each-group select="mods/name" group-by="@xlink:href">
    <--! applico il template, come prima -->
    <xsl:variable name="id_person" select="@xlink:href"/>
    <xsl:apply-templates select="doc($id_person)/eac">

        <xsl:with-param name="id_person" select="$id_person"/>

     </xsl:apply-templates>
</xsl:for-each-group>

Qualche operazione con XSL

Ammettiamo che io voglia far sì che se l’elemento è dispari venga inserito in un div, mentre se è pari venga inserito in un altro

<xsl:for-each select="elemento">
    <!-- controlla se è dispari -->
    <xsl:if test="position() mod 2 = 1">
<div class="dispari">
           <!-- resto della trasformazione --></div>
<!-- controlla se è pari, avrei potuto usare anche when e otherwise -->

    <xsl:if test="position() mod 2 = ">
<div class="pari">

           <!-- resto della trasformazione --></div>
</xsl:for-each>

Escluso l’ultimo sono tutte istruzioni di XSL-T 2.0.

Advertisements

LibXITA: costruire una barra di ricerca per la propria biblioteca

Che cos’è LibXITA

LibXITA è una versione personalizzata di LibX, con alcuni cambiamenti pensati per le biblioteche italiane. In particolare le modifiche apportate si sono concentrate su:

  • localizzazione di LibX, estraendo le stringhe dal codice e permettendo una semplice traduzione (caricata a seconda della lingua del browser);
  • nuovo parser per riconoscere i codici DOI e Pub Med ID, al fine di poter escludere i caratteri speciali al termine del codice;
  • aggiunta del supporto al codice ISBN per le ricerche con SFX;
  • aggiunta di cue [link diretti al catalogo] (internet book shoop, anobii, google books, etc);
  • interrogazione AJAX automatica dei cataloghi (in fase di test).

Che cos’è LibX

LibX è un plugin per firefox e internet explorer (con funzioni limitate) che permette l’accesso diretto ai cataloghi della propria biblioteca. In particolare LibX fornisce:

  • una barra per le ricerche dirette nei cataloghi;
  • un menù contestuale per lanciare ricerche selezionando testo;
  • il link automatico di codici ISBN, ISSN, DOI e PMID;
  • l’aggiunta di cue nei principali siti di vendita di libri che lancino una ricerca in OPAC;
  • il supporto a COinS

Risorse