Accueil
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi Eclipse MS-Office SQL & SGBD Oracle  4D  Business Intelligence
logo



Auteur : Erwan Amoureux
Version : 06/02/2007
Passer d'une architecture explicite plane à une architecture en profondeur
XML est plutôt pratique pour sa représentation d'arboressence selon une architecture en profondeur. Cependant, il est parfois utile de passer d'un modèle à l'autre.

Les règles de transformation sont les suivantes :
  • Chaque section devient un enfant de la section de niveau inférieur qui la précède immédiatement
  • Chaque noeud texte devient enfant de la section qui le précède immédiatement
  • Les attributs titre sont recopiés tels quels (ils ne sont là que pour faciliter la compréhension ; leur contenu est arbitraire)
Dans le cas présent, il faut à tout prix que le niveau de la section soit précisé, le script ne peut pas le détecter par lui-même.
Le XML

<?xml version="1.0" encoding="ISO-8859-1"?>
<document>
  <section niveau="1" titre="1"/>
  <texte>aaaa</texte>
  <section niveau="2" titre="1.1"/>
  <texte>bbbb</texte>
  <section niveau="3" titre="1.1.1"/>
  <texte>cccc</texte>
  <section niveau="3" titre="1.1.2"/>
  <texte>dddd</texte>
  <section niveau="2" titre="1.2"/>
  <texte>eeee</texte>
  <section niveau="3" titre="1.2.1"/>
  <texte>ffff</texte>
  <section niveau="2" titre="1.3"/>
  <texte>gggg</texte>
  <texte>hhhh</texte>
  <section niveau="3" titre="1.3.1"/>
  <section niveau="4" titre="1.3.1.1"/>
  <texte>iiii</texte>
  <section niveau="4" titre="1.3.1.2"/>
  <texte>jjjj</texte>
  <section niveau="1" titre="2"/>
  <texte>kkkk</texte>
  <section niveau="2" titre="2.1"/>
  <texte>llll</texte>
  <section niveau="2" titre="2.2"/>
  <texte>mmmm</texte>
</document>
Le XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/document">
    <xsl:copy>
      <xsl:apply-templates select="section[@niveau = 1]"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="section">
    <xsl:variable name="id_noeud" select="generate-id(.)"/>
    <xsl:copy>
      <xsl:copy-of select="@titre"/>
      <xsl:apply-templates select="following-sibling::texte[generate-id(preceding-sibling::section[1]) = $id_noeud]"/>
      <xsl:apply-templates select="following-sibling::section[(@niveau = current()/@niveau + 1) and (generate-id(preceding-sibling::section[@niveau = current()/@niveau][1]) = $id_noeud)]"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="texte">
    <xsl:copy-of select="."/>
  </xsl:template>

</xsl:stylesheet>
Le Résultat

<?xml version="1.0" encoding="UTF-8"?>
<document>
  <section titre="1">
    <texte>aaaa</texte>
    <section titre="1.1">
      <texte>bbbb</texte>
      <section titre="1.1.1">
        <texte>cccc</texte>
      </section>
      <section titre="1.1.2">
        <texte>dddd</texte>
      </section>
    </section>
    <section titre="1.2">
      <texte>eeee</texte>
      <section titre="1.2.1">
        <texte>ffff</texte>
      </section>
    </section>
    <section titre="1.3">
      <texte>gggg</texte>
      <texte>hhhh</texte>
      <section titre="1.3.1">
        <section titre="1.3.1.1">
          <texte>iiii</texte>
        </section>
        <section titre="1.3.1.2">
          <texte>jjjj</texte>
        </section>
      </section>
    </section>
  </section>
  <section titre="2">
    <texte>kkkk</texte>
      <section titre="2.1">
        <texte>llll</texte>
      </section>
      <section titre="2.2">
        <texte>mmmm</texte>
      </section>
  </section>
</document>

Auteur : Erwan Amoureux
Version : 06/02/2007
Passer d'une architecture implicite plane à une architecture en profondeur
Cette fois, le script XSLT permet l'utilisation d'une hiérarchie non explicite et éventuellement désordonnée à une architecture en profondeur.
De plus, il est possible (moyennant des modifications mineures) de changer la hierarchie utilisée.
Par exemple, passer d'une classification où ce sont les chiffres de gauches du numéro qui sont les plus importants à une classification où ce sont ceux de droite.
Le XML

<?xml version="1.0" encoding="ISO-8859-1"?>
<ROWSET>
	<ROW num="1">
		<N>0100000000</N>
	</ROW>
	<ROW num="2">
		<N>0101000000</N>
	</ROW>
	<ROW num="3">
		<N>0101100000</N>
	</ROW>
	<ROW num="4">
		<N>0101101000</N>
	</ROW>
	<ROW num="5">
		<N>0101109000</N>
	</ROW>
	<ROW num="6">
		<N>0101109010</N>
	</ROW>
	<ROW num="7">
		<N>0101109090</N>
	</ROW>
	<ROW num="8">
		<N>0101900000</N>
	</ROW>
	<ROW num="9">
		<N>0101901100</N>
	</ROW>
	<ROW num="10">
		<N>0101901900</N>
	</ROW>
	<ROW num="11">
		<N>0101903000</N>
	</ROW>
	<ROW num="12">
		<N>0101909000</N>
	</ROW>
	<ROW num="13">
		<N>0102000000</N>
	</ROW>
	<ROW num="14">
		<N>0102100000</N>
	</ROW>
	<ROW num="15">
		<N>0102101000</N>
	</ROW>
	<ROW num="16">
		<N>0102103000</N>
	</ROW>
	<ROW num="17">
		<N>0102109000</N>
	</ROW>
	<ROW num="18">
		<N>0102900000</N>
	</ROW>
	<ROW num="19">
		<N>0102900500</N>
	</ROW>
	<ROW num="20">
		<N>0102900510</N>
	</ROW>
	<ROW num="21">
		<N>0102900520</N>
	</ROW>
	<ROW num="22">
		<N>0102900530</N>
	</ROW>
	<ROW num="23">
		<N>0102900540</N>
	</ROW>
	<ROW num="24">
		<N>0102900550</N>
	</ROW>
	<ROW num="25">
		<N>0102900590</N>
	</ROW>
	<ROW num="26">
		<N>0102902100</N>
	</ROW>
	<ROW num="27">
		<N>0102902900</N>
	</ROW>
	<ROW num="28">
		<N>0102902910</N>
	</ROW>
	<ROW num="29">
		<N>0102902920</N>
	</ROW>
	<ROW num="30">
		<N>0102902930</N>
	</ROW>
	<ROW num="31">
		<N>0102902940</N>
	</ROW>
	<ROW num="32">
		<N>0102902950</N>
	</ROW>
	<ROW num="33">
		<N>0102902990</N>
	</ROW>
	<ROW num="34">
		<N>0102904100</N>
	</ROW>
	<ROW num="35">
		<N>0102904900</N>
	</ROW>
	<ROW num="36">
		<N>0102904910</N>
	</ROW>
	<ROW num="37">
		<N>0102904920</N>
	</ROW>
	<ROW num="38">
		<N>0102904930</N>
	</ROW>
	<ROW num="39">
		<N>0102904940</N>
	</ROW>
	<ROW num="40">
		<N>0102904950</N>
	</ROW>
	<ROW num="41">
		<N>0102904990</N>
	</ROW>
	<ROW num="42">
		<N>0102905100</N>
	</ROW>
	<ROW num="43">
		<N>0102905110</N>
	</ROW>
	<ROW num="44">
		<N>0102905190</N>
	</ROW>
	<ROW num="45">
		<N>0102905900</N>
	</ROW>
	<ROW num="46">
		<N>0102905911</N>
	</ROW>
	<ROW num="47">
		<N>0102905919</N>
	</ROW>
	<ROW num="48">
		<N>0102905921</N>
	</ROW>
	<ROW num="49">
		<N>0102905929</N>
	</ROW>
	<ROW num="50">
		<N>0102905931</N>
	</ROW>
	<ROW num="51">
		<N>0102905939</N>
	</ROW>
	<ROW num="52">
		<N>0102905991</N>
	</ROW>
	<ROW num="53">
		<N>0102905999</N>
	</ROW>
	<ROW num="54">
		<N>0102906100</N>
	</ROW>
	<ROW num="55">
		<N>0102906900</N>
	</ROW>
	<ROW num="56">
		<N>0102906910</N>
	</ROW>
	<ROW num="57">
		<N>0102906920</N>
	</ROW>
	<ROW num="58">
		<N>0102906930</N>
	</ROW>
	<ROW num="59">
		<N>0102906990</N>
	</ROW>
	<ROW num="60">
		<N>0102907100</N>
	</ROW>
	<ROW num="61">
		<N>0102907110</N>
	</ROW>
	<ROW num="62">
		<N>0102907190</N>
	</ROW>
	<ROW num="63">
		<N>0102907900</N>
	</ROW>
	<ROW num="64">
		<N>0102907921</N>
	</ROW>
	<ROW num="65">
		<N>0102907929</N>
	</ROW>
	<ROW num="66">
		<N>0102907991</N>
	</ROW>
	<ROW num="67">
		<N>0102907999</N>
	</ROW>
	<ROW num="68">
		<N>0102909000</N>
	</ROW>
	<ROW num="69">
		<N>0103000000</N>
	</ROW>
	<ROW num="70">
		<N>0103100000</N>
	</ROW>
	<ROW num="71">
		<N>0103910000</N>
	</ROW>
	<ROW num="72">
		<N>0103911000</N>
	</ROW>
	<ROW num="73">
		<N>0103919000</N>
	</ROW>
	<ROW num="74">
		<N>0103920000</N>
	</ROW>
	<ROW num="75">
		<N>0103921100</N>
	</ROW>
	<ROW num="76">
		<N>0103921900</N>
	</ROW>
	<ROW num="77">
		<N>0103929000</N>
	</ROW>
	<ROW num="78">
		<N>0104000000</N>
	</ROW>
	<ROW num="79">
		<N>0104100000</N>
	</ROW>
	<ROW num="80">
		<N>0104101000</N>
	</ROW>
	<ROW num="81">
		<N>0104103000</N>
	</ROW>
	<ROW num="82">
		<N>0104108000</N>
	</ROW>
	<ROW num="83">
		<N>0104200000</N>
	</ROW>
	<ROW num="84">
		<N>0104201000</N>
	</ROW>
	<ROW num="85">
		<N>0104209000</N>
	</ROW>
	<ROW num="86">
		<N>0105000000</N>
	</ROW>
	<ROW num="87">
		<N>0105110000</N>
	</ROW>
	<ROW num="88">
		<N>0105111100</N>
	</ROW>
	<ROW num="89">
		<N>0105111900</N>
	</ROW>
	<ROW num="90">
		<N>0105119100</N>
	</ROW>
	<ROW num="91">
		<N>0105119900</N>
	</ROW>
	<ROW num="92">
		<N>0105120000</N>
	</ROW>
	<ROW num="93">
		<N>0105190000</N>
	</ROW>
	<ROW num="94">
		<N>0105192000</N>
	</ROW>
	<ROW num="95">
		<N>0105199000</N>
	</ROW>
	<ROW num="96">
		<N>0105920000</N>
	</ROW>
	<ROW num="97">
		<N>0105930000</N>
	</ROW>
	<ROW num="98">
		<N>0105990000</N>
	</ROW>
	<ROW num="99">
		<N>0105991000</N>
	</ROW>
	<ROW num="100">
		<N>0105992000</N>
	</ROW>
	<ROW num="101">
		<N>0105993000</N>
	</ROW>
	<ROW num="102">
		<N>0105995000</N>
	</ROW>
	<ROW num="103">
		<N>0106000000</N>
	</ROW>
	<ROW num="104">
		<N>0106110000</N>
	</ROW>
	<ROW num="105">
		<N>0106120000</N>
	</ROW>
	<ROW num="106">
		<N>0106190000</N>
	</ROW>
	<ROW num="107">
		<N>0106191000</N>
	</ROW>
	<ROW num="108">
		<N>0106199000</N>
	</ROW>
	<ROW num="109">
		<N>0106200000</N>
	</ROW>
	<ROW num="110">
		<N>0106310000</N>
	</ROW>
	<ROW num="111">
		<N>0106320000</N>
	</ROW>
	<ROW num="112">
		<N>0106390000</N>
	</ROW>
	<ROW num="113">
		<N>0106391000</N>
	</ROW>
	<ROW num="114">
		<N>0106399000</N>
	</ROW>
	<ROW num="115">
		<N>0106900000</N>
	</ROW>
	</ROWSET>
Le XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
	<xsl:key name="K1000000" match="N[number(.) mod 1000000=0 and number(.) mod 100000000!=0]" use="(number(.) -(number(.) mod 100000000))"/>
	<xsl:key name="K10000" match="N[number(.) mod 10000=0 and number(.) mod 1000000!=0]" use="(number(.) -(number(.) mod 1000000))"/>
	<xsl:key name="K100" match="N[number(.) mod 100=0 and number(.) mod 10000!=0]" use="(number(.) -(number(.)mod 10000))"/>
	<xsl:key name="K1" match="N[number(.) mod 100!=0]" use="(number(.) -(number(.) mod 100))"/>
	<xsl:template match="/">
		<xsl:element name="R">
			<xsl:for-each select="ROWSET/ROW/N[number(.) mod 100000000=0]">
				<A>
					<N>
						<xsl:value-of select="."/>
					</N>
					<xsl:apply-templates select="key('K1000000',number(.))">
						<xsl:with-param name="cle" select="'K1000000'"/>
					</xsl:apply-templates>
				</A>
			</xsl:for-each>
		</xsl:element>
	</xsl:template>
	<xsl:template match="N">
		<xsl:param name="cle"/>
		<xsl:variable name="cle_suivante">
			<xsl:call-template name="cleS">
				<xsl:with-param name="cle_s" select="$cle"/>
			</xsl:call-template>
		</xsl:variable>
		<A>
			<N>
				<xsl:value-of select="."/>
			</N>
			<xsl:if test="$cle!='K1'">
				<xsl:apply-templates select="key(string($cle_suivante),number(.))">
					<xsl:with-param name="cle" select="string($cle_suivante)"/>
				</xsl:apply-templates>
			</xsl:if>
		</A>
	</xsl:template>
	<xsl:template name="cleS">
		<xsl:param name="cle_s"/>
		<xsl:variable name="long" select="string-length($cle_s) - 2"></xsl:variable>
		<xsl:variable name="nom" select="substring($cle_s,1,$long)"></xsl:variable>
		<xsl:choose>
			<xsl:when test="$cle_s!='K1'"> 
				<xsl:choose>
					<xsl:when test="not(key($nom,number(.)))">
						<xsl:call-template name="cleS">
							<xsl:with-param name="cle_s" select="$nom"/>
						</xsl:call-template>
					</xsl:when>
					<xsl:otherwise>
						<xsl:value-of select="$nom"/>
					</xsl:otherwise>
				</xsl:choose>
			</xsl:when>
			<xsl:otherwise>K1</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
</xsl:stylesheet>
Le Résultat
<?xml version="1.0" encoding="UTF-16"?>
    <R>
      <A>
        <N>
          0100000000
        </N>
        <A>
          <N>
            0101000000
          </N>
          <A>
            <N>
              0101100000
            </N>
            <A>
              <N>
                0101101000
              </N>
            </A>
            <A>
              <N>
                0101109000
              </N>
              <A>
                <N>
                  0101109010
                </N>
              </A>
              <A>
                <N>
                  0101109090
                </N>
              </A>
            </A>
          </A>
          <A>
            <N>
              0101900000
            </N>
            <A>
              <N>
                0101901100
              </N>
            </A>
            <A>
              <N>
                0101901900
              </N>
            </A>
            <A>
              <N>
                0101903000
              </N>
            </A>
            <A>
              <N>
                0101909000
              </N>
            </A>
          </A>
        </A>
        <A>
          <N>
            0102000000
          </N>
          <A>
            <N>
              0102100000
            </N>
            <A>
              <N>
                0102101000
              </N>
            </A>
            <A>
              <N>
                0102103000
              </N>
            </A>
            <A>
              <N>
                0102109000
              </N>
            </A>
          </A>
          <A>
            <N>
              0102900000
            </N>
            <A>
              <N>
                0102900500
              </N>
              <A>
                <N>
                  0102900510
                </N>
              </A>
              <A>
                <N>
                  0102900520
                </N>
              </A>
              <A>
                <N>
                  0102900530
                </N>
              </A>
              <A>
                <N>
                  0102900540
                </N>
              </A>
              <A>
                <N>
                  0102900550
                </N>
              </A>
              <A>
                <N>
                  0102900590
                </N>
              </A>
            </A>
            <A>
              <N>
                0102902100
              </N>
            </A>
            <A>
              <N>
                0102902900
              </N>
              <A>
                <N>
                  0102902910
                </N>
              </A>
              <A>
                <N>
                  0102902920
                </N>
              </A>
              <A>
                <N>
                  0102902930
                </N>
              </A>
              <A>
                <N>
                  0102902940
                </N>
              </A>
              <A>
                <N>
                  0102902950
                </N>
              </A>
              <A>
                <N>
                  0102902990
                </N>
              </A>
            </A>
            <A>
              <N>
                0102904100
              </N>
            </A>
            <A>
              <N>
                0102904900
              </N>
              <A>
                <N>
                  0102904910
                </N>
              </A>
              <A>
                <N>
                  0102904920
                </N>
              </A>
              <A>
                <N>
                  0102904930
                </N>
              </A>
              <A>
                <N>
                  0102904940
                </N>
              </A>
              <A>
                <N>
                  0102904950
                </N>
              </A>
              <A>
                <N>
                  0102904990
                </N>
              </A>
            </A>
            <A>
              <N>
                0102905100
              </N>
              <A>
                <N>
                  0102905110
                </N>
              </A>
              <A>
                <N>
                  0102905190
                </N>
              </A>
            </A>
            <A>
              <N>
                0102905900
              </N>
              <A>
                <N>
                  0102905911
                </N>
              </A>
              <A>
                <N>
                  0102905919
                </N>
              </A>
              <A>
                <N>
                  0102905921
                </N>
              </A>
              <A>
                <N>
                  0102905929
                </N>
              </A>
              <A>
                <N>
                  0102905931
                </N>
              </A>
              <A>
                <N>
                  0102905939
                </N>
              </A>
              <A>
                <N>
                  0102905991
                </N>
              </A>
              <A>
                <N>
                  0102905999
                </N>
              </A>
            </A>
            <A>
              <N>
                0102906100
              </N>
            </A>
            <A>
              <N>
                0102906900
              </N>
              <A>
                <N>
                  0102906910
                </N>
              </A>
              <A>
                <N>
                  0102906920
                </N>
              </A>
              <A>
                <N>
                  0102906930
                </N>
              </A>
              <A>
                <N>
                  0102906990
                </N>
              </A>
            </A>
            <A>
              <N>
                0102907100
              </N>
              <A>
                <N>
                  0102907110
                </N>
              </A>
              <A>
                <N>
                  0102907190
                </N>
              </A>
            </A>
            <A>
              <N>
                0102907900
              </N>
              <A>
                <N>
                  0102907921
                </N>
              </A>
              <A>
                <N>
                  0102907929
                </N>
              </A>
              <A>
                <N>
                  0102907991
                </N>
              </A>
              <A>
                <N>
                  0102907999
                </N>
              </A>
            </A>
            <A>
              <N>
                0102909000
              </N>
            </A>
          </A>
        </A>
        <A>
          <N>
            0103000000
          </N>
          <A>
            <N>
              0103100000
            </N>
          </A>
          <A>
            <N>
              0103910000
            </N>
            <A>
              <N>
                0103911000
              </N>
            </A>
            <A>
              <N>
                0103919000
              </N>
            </A>
          </A>
          <A>
            <N>
              0103920000
            </N>
            <A>
              <N>
                0103921100
              </N>
            </A>
            <A>
              <N>
                0103921900
              </N>
            </A>
            <A>
              <N>
                0103929000
              </N>
            </A>
          </A>
        </A>
        <A>
          <N>
            0104000000
          </N>
          <A>
            <N>
              0104100000
            </N>
            <A>
              <N>
                0104101000
              </N>
            </A>
            <A>
              <N>
                0104103000
              </N>
            </A>
            <A>
              <N>
                0104108000
              </N>
            </A>
          </A>
          <A>
            <N>
              0104200000
            </N>
            <A>
              <N>
                0104201000
              </N>
            </A>
            <A>
              <N>
                0104209000
              </N>
            </A>
          </A>
        </A>
        <A>
          <N>
            0105000000
          </N>
          <A>
            <N>
              0105110000
            </N>
            <A>
              <N>
                0105111100
              </N>
            </A>
            <A>
              <N>
                0105111900
              </N>
            </A>
            <A>
              <N>
                0105119100
              </N>
            </A>
            <A>
              <N>
                0105119900
              </N>
            </A>
          </A>
          <A>
            <N>
              0105120000
            </N>
          </A>
          <A>
            <N>
              0105190000
            </N>
            <A>
              <N>
                0105192000
              </N>
            </A>
            <A>
              <N>
                0105199000
              </N>
            </A>
          </A>
          <A>
            <N>
              0105920000
            </N>
          </A>
          <A>
            <N>
              0105930000
            </N>
          </A>
          <A>
            <N>
              0105990000
            </N>
            <A>
              <N>
                0105991000
              </N>
            </A>
            <A>
              <N>
                0105992000
              </N>
            </A>
            <A>
              <N>
                0105993000
              </N>
            </A>
            <A>
              <N>
                0105995000
              </N>
            </A>
          </A>
        </A>
        <A>
          <N>
            0106000000
          </N>
          <A>
            <N>
              0106110000
            </N>
          </A>
          <A>
            <N>
              0106120000
            </N>
          </A>
          <A>
            <N>
              0106190000
            </N>
            <A>
              <N>
                0106191000
              </N>
            </A>
            <A>
              <N>
                0106199000
              </N>
            </A>
          </A>
          <A>
            <N>
              0106200000
            </N>
          </A>
          <A>
            <N>
              0106310000
            </N>
          </A>
          <A>
            <N>
              0106320000
            </N>
          </A>
          <A>
            <N>
              0106390000
            </N>
            <A>
              <N>
                0106391000
              </N>
            </A>
            <A>
              <N>
                0106399000
              </N>
            </A>
          </A>
          <A>
            <N>
              0106900000
            </N>
          </A>
        </A>
      </A>
    </R>


Consultez les autres pages sources


Les sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2006  Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com