Developpez.com - XML
X

Choisissez d'abord la catégorieensuite la rubrique :

logo
Sommaire > Le 'XML Stylesheet Language : Transformations' (XSLT) > Feuilles XSLT > passage de fichier 'a plat' à une forme arborescente
        Passer d'une architecture explicite plane à une architecture en profondeur
        Passer d'une architecture implicite plane à une architecture en profondeur



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


Valid XHTML 1.0 TransitionalValid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 Developpez 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Contacter le responsable de la rubrique XML