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 !