Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Trasformare un XML in una <ul> con XSL

    salve a tutti, volevo chiedere come è possibile effettuare una trasformazione del genere:

    il file xml è qualcosa di simile (tralascio le dichiarazioni iniziali)
    codice:
    <home>
      <musica>
         <cubase>
            <realpiano></realpiano>
            <realguitar></realguitar>
            <ezdrummer></ezdrummer>
         </cubase>
         <audacity></audacity>
      </musica>
      <grafica>
         <blender></blender>
         <gimp></gimp>
      </grafica>
    </home>
    e vorrei che con xsl mi desse il seguente output
    codice:
    <ul>
    	[*]musica
    	<ul>
    		[*]cubase
    		<ul>
    			[*]realpiano
    			[*]realguitar
    			[*]ezdrummer
    		[/list]
    		[*]audacity
    	[/list]
    	[*]grafica
    	<ul>
    		[*]blender
    		[*]gimp
    	[/list][/list]
    ho provato in diversi modi, sia con il foreach che i template ma niente da fare; sono riuscito a scorrere tutti gli elementi di home tramite questo ciclo, ma ovviamente non riesco a racchiudere i child-node nel tag <ul> del child-parent

    codice:
    					<xsl:for-each select="home//*">
    						<xsl:if test="count(./*) &gt; 0">
    							[*]<xsl:value-of select="name()"/>
    							<xsl:element name="ul"></xsl:element>
    						</xsl:if>
    						<xsl:if test="count(./*) = 0">
    							[*]<xsl:value-of select="name()" />
    						</xsl:if>
    					</xsl:for-each>
    il mio obbiettivo con questo ciclo era quello dio trasformare i nodi con i figli in
    [*]nodo
    <ul>

    e i nodi senza figli in
    [*]nodo

    e i nodi che sono ultimi figli in
    [*]nodo[/list]

    spero di essere stato chiaro.

  2. #2

  3. #3
    Eureka! ci sono riuscito dopo milioni di tentativi:

    il codice che segue dovete inserirlo nel template principale (quello che ha match="/" per intenderci)


    codice:
    				<ul>
    					<xsl:for-each select="home//*">
    						<xsl:if test="count(./*) &gt; 0">
    							<xsl:apply-templates select="."/>
    						</xsl:if>	
    					</xsl:for-each>
    				[/list]
    l'istruzione if indica che saranno considerati solo i nodi che hanno figli;
    all'interno dell'attributo test c'è un'istruzione XPath che si traduce così

    count(./*) = conta il numero di nodi figli a partire dal nodo corrente;

    &gt; = è il codice per indicare il simbolo di maggiore '>';

    e questo è il template richiamato all'interno del for-each;

    codice:
    	<xsl:template match="*">
    		[*]<xsl:value-of select="name()"/>
    		<xsl:element name="ul">
    			<xsl:apply-templates/>
    		</xsl:element>
    	</xsl:template>
    con questo avrete un lista <ul> con relativi[*] e altrettanti <ul> ramificati così come è strutturato il vostro xml.

  4. #4
    ERRATA CORRIGE! nel codice precedente non mi ero reso conto che nella chiamata ricorsiva al template, considerava i nodi figli due volte, una come figlio un'altra come genitore;
    il seguente è il codice corretto per estrarre un tag <ul> da un xml dalla struttura come sopra:

    codice:
    	<xsl:template match="/">
    		<ul>
    			<xsl:for-each select="home/*">
    				<xsl:apply-templates select="."/>
    			</xsl:for-each>
    		[/list]
    	</xsl:template>
    	
    	<xsl:template match="node()">
    		[*]<xsl:value-of select="name()"/>
    
    		<xsl:element name="ul">
    			<xsl:apply-templates/>
    		</xsl:element>
    	</xsl:template>
    Nell'attributo select del for-each ho indicato 'home/*' al posto di 'home//*' indicando che deve esaminare solo il contenuto direttamente figlio di home (ossia la root);
    poi ho semplicemente sostituito nell'attributo match del secondo template l'aterisco '*' con 'node()' che impone al template di esaminare solo i nodi e non anche il contenuto (ad esempio una semplice scritta);

    spero che sia utile a qualcuno e sono comunque in attesa di eventuali correzioni.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.