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.

One thought on “Appunti di XSL-T

  1. Pingback: Script PHP per eliminare spazi e controllare validità link « Cultural Heritage E-Libraries and Archives

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s