Ciao a tutti,
Sul blog di Harri Kiiskinen è presente un codice xslt per passare da docx (document.xml contenuto in tutti i file .docx) a latex. Minimale ma funzionale.
C'è solo un problema, nel processare le note a piè di pagina il codice restituisce sempre e solo il testo relativo alla nota numero 1. Cerco di spiegare il problema:
La struttura delle note all'interno del testo in document.xml in docx è, MOLTO in sintesi, la seguente:
codice:
<w:document>
<w:body>
<w:p>
<w:r>
<w:footnoteReference w:id="n" />
</w:r>
<w:r>
<w:footnoteReference w:id="n+1" />
</w:r>
......
</w:p>
</w:body>
</w:document>
Il testo delle note è presente in un secondo file, footnotes.xml, in questo modo:
codice:
<w:footnotes>
<w:footnote w:id="n">
<w:p>
<w:r>
<w:t>
Testo della nota
</w:t>
</w:r>
</w:p>
</w:footnote>
....
</w:footnotes>
Ed ecco come il codice del blog fa il parsing dei due file (mi limito a riportare il codice relativo alle note):
codice:
<xsl:template match="w:r">
<xsl:if test="w:footnoteReference">
<xsl:text>\footnote{ </xsl:text>
<xsl:call-template name="footnote">
<xsl:with-param name="fid">
<xsl:value-of select="//@w:id" />
</xsl:with-param>
</xsl:call-template>
<xsl:text>}</xsl:text>
</xsl:if>
</xsl:template>
<xsl:template name="footnote">
<xsl:param name="fid" />
<xsl:apply templates select="document('footnotes.xml')/w:footnotes/w:footnote[@w:id=$fid]" />
</xsl:template>
<xsl:template match="//w:footnote">
<xsl:apply-templates select="w:p" />
</xsl:template>
La linea di principio è semplice: il codice cerca il nodo footnoteReference nel primo file, memorizza il valore dell'attributo w:id nel parametro fid e lo passa al template "footnote", il quale fa il parsing di footnotes.xml e cerca la nota con w:id = fid per poi estrarre il testo contenuto in w
.
C'è però qualcosa che fa sì che la procedura di volta in volta riporti fid al valore 1 iniziale.
Qualcuno di voi saprebbe spiegarmi come mai il codice non funziona correttamente? Sono agli inizi con XSL (ma conosco discretamente altri linguaggi).
Grazie !