Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [XSL] Richiamare XML

  1. #1

    [XSL] Richiamare XML

    Giro da un po' e non ho capito se e possibile farlo o meno.
    ho un file xml che richiama uno xsl.
    Ora ho bisogno che il file xsl faccia dei controlli su un ALTRO file xml (del tipo if then else) ed in base a questi controlli produrre html.
    C'e un modo per farlo?

    Grazie
    D.

  2. #2
    Ciao,
    l'unico modo per farlo è accorpare i 2 documenti XML in un unico file,
    se utilizzi un linguaggio lato server (PHP, ASP ...) puoi farlo mantenendo i file separati.

    A quel punto tramite XSL puoi interrogare uno dei 2 rami dell'albero XML per creare l'output con l'altro ramo.

    Ciao
    Mirko Agrati
    WEB : http://mirkoagrati.110mb.com
    RSS : http://feeds.feedburner.com/MirkoAgratiArticoli

  3. #3
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Invece no, però sto incontrando seri problemi comunque a farlo e vorrei capirne il perché se qualcuno mi aiuta.
    (per i mod: ho trovata questa discussione che pare faccia al caso mio, evito di aprirne un'altra uguale, se per voi va bene, altrimenti dividetela se credete giusto farlo)

    Allora: anche io ho lo stesso problema con un CMS che sto costruendo, in pratica in ogni file XML c'è il contenuto di una pagina processata dal relativo XSLT e fino qui mi pare tutto normale.
    Il problema lo incontro nel momento che devo unire ad ogni pagina il menù del sito, che è su un file xml separato.
    I motivi di questa configurazione mi sono apparsi ovvi nel momento che ho cercato un buon metodo per gestire il menù in modo separato, senza dover aprire ogni volta tutti gli XML delle pagine per modificarne la sezione menù.
    Ma nonostante questa sembrasse la soluzione più ovvia, non funziona.
    Probabilmente la colpa è mia dato che sono un neofito di trasformazioni XSL.

    Vi faccio degli esempi:
    il file menu.xml
    codice:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <menu.sito>
    	<li id="0">
    		<href>./</href>
    		<title>l'home page del sito</title>
    		<rel></rel>
    		<testo>Home Page</testo>
    	
    	<li id="1">
    		<href>./admin/</href>
    		<title>amministrazione del sito</title>
    		<rel></rel>
    		<testo>Amministrazione</testo>
    	
    </menu.sito>
    il file della pagina da processare, in questo semplice caso una index.xml
    codice:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <root>
    	<title>Sito in costruzione (fantasioso)</title>
    	<banner>
    		<img>
    			<url>img/logo.gif</url>
    			<alt>logo ufficiale del sito</alt>
    		</img>
    		<h1>Il mio sito</h1>
    		<h2>prova del sito</h2>
    	</banner>
    	<corpo.pagina>
    		<h1>Il mio sito</h1>
    		<h2>sito in perenne costruzione</h2>
    	</corpo.pagina>
    	<piede>
    		<testo>Sito realizzato da Marco GRAZIA © 2007 - 2008</testo>
    		<link />
    	</piede>
    </root>
    All'interno del file XSL (che è molto grande e che quindi metterò a spezzoni) il template che si occupa di creare il menù è il seguente:
    index.xsl
    codice:
    <xsl:template match="menu.sito">
    	<xsl:element name="div">
    		<xsl:attribute name="id">left-bar</xsl:attribute>
    		<xsl:element name="ul">
    			<xsl:attribute name="class">menuNav</xsl:attribute>
    			<xsl:apply-templates />
    		</xsl:element>
    	</xsl:element>
    	<xsl:element name="hr"/>
    </xsl:template>
    
    <xsl:key name="1" match="//menu.sito/li" use="@id"/>
    <xsl:template match="li">
    	<xsl:element name="li">
    		<xsl:element name="a">
    			<xsl:attribute name="href"><xsl:value-of select="key('1',@id)/href"/></xsl:attribute>
    			<xsl:attribute name="title"><xsl:value-of select="key('1',@id)/title"/></xsl:attribute>
    			<xsl:if test="key('1',@id)/rel!=''">
    				<xsl:attribute name="rel"><xsl:value-of select="key('1',@id)/rel"/></xsl:attribute>
    			</xsl:if>
    			<xsl:value-of select="key('1',@id)/testo"/>
    		</xsl:element>
    	</xsl:element>
    </xsl:template>
    il primo template (menu.sito) si occupa di creare l'elemento <div> con all'interno la classe chiamante il foglio di stile per il menù e poi di aprire una lista <ul>.
    Il secondo template (li) si occupa di richiamare dalla struttura di menu.xml tutti gli elementi a formare le liste con all'interno i menù.
    Se concateno a mano i due files XML, e cioè: index.xml e menu.xml i template funzionano alla perfezione e ho la pagina in output perfetta.
    Ma se provo a unire i due documenti XML così come descritto dal W3C iniziano i problemi.

    La sintassi appare semplice in effetti. (adattata al mio caso)
    Si richiede: <xsl:variable name="menu" select="document('menu.xml')/menu.sito"/>
    il name menu è la variabile che contiene (o dovrebbe contenere) il file selezionato, ovvero menu.xml.
    Ho fatto delle prove, ma non c'è verso di far apparire nulla.
    Ho creato un semplice template ad hoc:
    codice:
    <xsl:template match="prova">
        <xsl:value-of select="$menu/li/testo"/>
    </xsl:template>
    che richiamato all'interno di un paragrafo avrebbe dovuto far apparire il testo, ma nulla, non mi appare nemmeno un singolo messaggio di un sippur piccolo errore, semplicemente non appare nulla, come se menu.xml non esista, e so che esiste nella directory.
    Se qualcuno sa darmi una mano sarà una mano per tutti coloro che hano il mio stesso problema.
    Grazie.

  4. #4
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Forse ho trovato la risposta in un altro documento: XInclude, ci sto lavorando su.

    EDIT: in realtà ci sono moltissime possibilità di includere un quasiasi documento all'interno di un file XML, sto leggendo molto e mi si sono aperte delle possibilità che prima non pensavo di avere. (L'abisso della mia ignoranza in questa materia è notevole, ce ne vorranno di camion di cultura per colmarlo/per la serie non mangerò più baci perugina )
    Detto ciò, ecco le perle di saggezza che ho trovato: XLink, XInclude sicuramente, XPointer, XMLBase.

    Un esempio con XLink:
    in un dato documento XML, nel punto esatto dove deve essere collegato il nuovo spezzone di file esterno, sia esso un altro XML o un'immagine o altro ancora, inserire la seguente notifica <documento xlink:type="simple" xlink:href="file_esterno.xml">Analisi del bilancio della BCE</documento>, ovviamente per funzionare, bisogna specificare in cima al documento XML chiamante il namespace di XLink, ovvero xmlns:xlink="http://www.w3c.org/1999/xlink".
    Poi c'è quello che forse è più facile, XMLBase, ecco uno spezzone di codice:
    codice:
    <?xml version="1.0"?>
    <doc xml:base="http://www.miosito.bo/cartella/del/documento/da/caricare" xmlns:xlink="http://www.w3c.org/1999/xlink">
    <link xlink:type="simple" xlink:href="documento1.xml">Documento 1</link>
    <link xlink:type="simple" xlink:href="documento2.xml">Documento 2</link>
    </doc>
    come si vede XMLBase fa uso di XLink e serve solo a specificare dove si troveranno i documenti, così da non dover scrivere ogni volta il loro uri di riferimento in href.
    Inoltre i documenti inclusi possono essere più di uno.

    Farò delle prove sul mio progetto e poi vi faccio sapere.

  5. #5
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Mi autorispondo anche perché credo che questa cosa sia utile a tantissima gente.
    Ebbene dopo aver tanto studiato sono arrivato alla conclusione che usare tecnologie come XPath o simili non è sempre conveniente, in quanto pur essendo standard del W3C le loro implementazioni nei sistemi operativi sono sempre relativamente imprecise o comunque modificate rispetto allo standard.
    In particolare nonostante gli esempi di cui sopra, con tanto di documentazione non sono riuscito fino ad oggi a utilizzarle.
    Invece!
    Invece seguendo un esempio dal libro di Thomas Myers "Sviluppo Web con XML e PHP", lui ad un certo punto collega due file xml tramite una DTD
    Come? Semplice!
    Si crea una DTD, per esempio: menu.dtd
    codice:
    <!ENTITY copyright "Marco copyright 2008">
    <!ENTITY menu SYSTEM "menu.xml">
    tutto qui.

    Quindi si crea il file menu.xml, che può essere:
    codice:
    <?xml version='1.0' encoding='ISO-8859-1'?>
    <menu>
    	<link>collegamento 1</link>
    </menu>
    Ovviamente può essere anche più complesso.

    Quindi nel file indirizzario.xml a cui si vuole collegare il menu.xml si fa questo:
    codice:
    <?xml version='1.0' encoding='ISO-8859-1' standalone='no'?>
    <!DOCTYPE menu SYSTEM "menu.dtd">
    <indirizzi>
    	<austria id='feldkirchen'>
    		<nome>Bezirksgericht Feldkirchen i.K.</nome>
    		<prenome />
    		<indirizzo>Foregger Platz, 1</indirizzo>
    		<citta>A-9560 Feldkirchen</citta>
    		<nazione>Österreich</nazione>
    	</austria>
                 <copy>&copy;</copy>
    	<menus>&menu;</menus>
    </indirizzi>
    In pratica si collega la DTD creata prima, quella con la regola che crea una entità chiamata menu, e poi nel punto esatto in cui si vuole includere il file menu.xml, si richiama l'entità &menu; e in uscita se tutto è stato trascritto correttamente si ottiene il file xml con linkato il secondo file xml: Internet Explorer 6 su NT4
    codice:
    <?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?> 
      <!DOCTYPE indirizzo (View Source for full doctype...)> 
    - <indirizzi>
    - <austria id="feldkirchen">
      <nome>Bezirksgericht Feldkirchen i.K.</nome> 
      <prenome /> 
      <indirizzo>Foregger Platz, 1</indirizzo> 
      <citta>A-9560 Feldkirchen</citta> 
      <nazione>Österreich</nazione> 
      </austria>
      <copy>Marco copyright 2008</copy> 
    - <menus>
    - <menu>
      <link>collegamento 1</link> 
      </menu>
      </menus>
      </indirizzi>
    Da notare che ho pure inventato una nuova entità chiamata copyright che scrive un copyright

    Tutto questo sembra complesso, ma tenete conto due cose importanti: una DTD ci vuole se si sta creando un CMS basato su XML, così si da consistenza ai dati e si evita che chi usa il CMS scriva "cose strane" al suo interno, poi è un'ottima strada per includere uno o più file xml all'interno del principale.
    Sì perché nessuno ci vieta di creare tante entità quanti sono i file da includere.
    Tenete anche presente che i file da includere possono essere residenti anche su altri server.
    Secondo Myer, lo scrittore, questo è il metodo classico per includere report da altre fonti all'interno di un altro report XML. Se funziona a lui, perché non dovrebbe anche a noi?

  6. #6
    scusa ma non riesco a capire come funziona xinclude..quello di cui ho bisogno è che all'interno di un certo xml sia "importato" un tag e il suo contenuto presenti in un altro xml..

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.