RESSOURCES 
 
Récupérer le contenu d'un tableau HTML sous forme de données XML avec XSLT
Sous licence GPL 09 octobre 2001
 
 


Ce script XSLT (table_n_columns2XML.xslt) permet de récupérer le contenu d'un tableau HTML en produisant des balises HTML correspondant aux titres de colonnes (première ligne du tableau, entre les balises <TH> et </TH>). L'usage est donné par la première ligne de commentaire.


<?xml version="1.0" encoding="iso-8859-1" ?>

<!--
xt tableau.htm table_n_columns2XML.xslt > donnees.xml

xsl:exclude-result-prefixes="#default"
xmlns="http://www.w3.org/Profiles/xhtml1-transitional"
xmlns="http://www.w3.org/1999/xhtml"
indent = "yes"
-->

<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
version="1.0"
>

  <xsl:output method = "xml" encoding="iso-8859-1" />
  <xsl:strip-space elements = "tr th font tbody table body html" />

  <xsl:variable name='header-row'>
    <xsl:copy-of select="(/*/*/*['table'=local-name()]//*['tr'=local-name()]) [1]"/>
  </xsl:variable>

  <xsl:template name="replace-spaces" >
    <xsl:param name="mystring"></xsl:param>
    <xsl:variable name ="match" > &#xa0;/()"éèêàûôîï&lt;&gt;&amp;°:</xsl:variable>
    <xsl:variable name ="replace">__----eeeauoii---0-</xsl:variable>
    <xsl:value-of select='translate(normalize-space($mystring), $match, $replace)'/>
  </xsl:template>

  <xsl:template match="*[ local-name() ='td']">
    <xsl:variable name="current_position">
      <xsl:value-of select="position()"/>
    </xsl:variable>
    <xsl:variable name="colpos">
      <xsl:value-of select="count( (../*[ local-name() ='td']) [ position() &lt;= $current_position ])"/>
    </xsl:variable>
    <!--
    DEBUG $current_position <xsl:value-of select="$current_position"/>
    DEBUG $colpos <xsl:value-of select="$colpos"/>
    -->
    <xsl:variable name="colname">
      <xsl:value-of select="$header-row/*[ local-name() ='tr']/*[ local-name() ='td' or local-name() ='th'] [position() = $colpos ]"/>
    </xsl:variable>
    <xsl:variable name="colname2" >
      <xsl:call-template name="replace-spaces">
        <xsl:with-param name="mystring">
        <xsl:value-of select="$colname"/>
        </xsl:with-param>
      </xsl:call-template>
    </xsl:variable>

    <xsl:if test="string-length($colname2)">
      <!--
      <xsl:message> $colname2="<xsl:value-of select="$colname2"/>" </xsl:message>
      -->
      <xsl:element name="{$colname2}">
        <xsl:value-of select="normalize-space(.)"/>
      </xsl:element>
    </xsl:if>
  </xsl:template>

  <xsl:template match="/">
  <!--
    DEBUG $header-row
    DEBUG <xsl:copy-of select="$header-row" />
    DEBUG FIN $header-row
    -->
    <xsl:text>&#x000a;</xsl:text>
    <table>
    <xsl:text>&#x000a;</xsl:text>
    <xsl:if test="$header-row">
      <xsl:comment>XML tags created from HTML headers by table_n_columns2XML.xslt
      </xsl:comment>
      <thead>
      <xsl:for-each select="$header-row" >
        <xsl:copy>
          <xsl:for-each select="//*[ local-name() ='th'] | //TH | //td | //TD" >
            <th> <xsl:apply-templates /> </th>
          </xsl:for-each>
        </xsl:copy>
      </xsl:for-each>
      </thead>
  
      <xsl:for-each select="(//*[ local-name() ='tr' ] | //TR)[position()&gt;1][(*[ local-name() ='td']|TD) and not(*[ local-name() ='th'])]" >
        <xsl:text>&#x000a;</xsl:text>
        <!--
        DEBUG count(*)=<xsl:copy-of select="count(*)" />
        DEBUG count(node())=<xsl:copy-of select="count(node())" />
        -->
        <tr> <xsl:apply-templates select='*' /> </tr>
      </xsl:for-each>
      <xsl:text>&#x000a;</xsl:text>
    </xsl:if><!-- test="$header-row" -->
    </table>
  </xsl:template>

</xsl:stylesheet>

 
Accueil | Haut de page