XSL applicato all'XML

di il
12 risposte

XSL applicato all'XML

Salve ragazzi, sono un neofita di XML e vorrei chiedervi di poter aiutarmi a risolvere una domanda che mi è stata fatta. Dovrei in pratica descrivere l’xml risultante alla applicazione all’ XML (1) dell’ XSL(2), o anche descrivere l'output risultante.
Vi posto il codice XML
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Utente nome="Enrico" cognome="Conti" username="enrico.conti" password="mypassword" role="ADMINISTRATOR"/>
<Ruolo name="ADMINISTRATOR" descrizione="Amministratore"/>
<Ruolo name="NORMALUSER" descrizione="Utente normale"/>
<Node element1="PROVA">
<Contatto nome="Signor franco" cognome="Franchi" id_contatto="1" principale="true"/>
<Contatto nome="Toro" cognome="Seduto" id_contatto="2"/>
</Node>
<Utente nome="Topo" cognome="Gigio" role="NORMALUSER"/>
</root>
Questo è invece l' XSL rappresentante la trasformazione

<?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" />
<xsl:template name="ShowContatto">
<xsl:param name="position" select="1"/>
<tr>
<xsl:if test="@principale='true' ">
<xsl:attribute name="class">redCss</xsl:attribute>
</xsl:if>
<th>contatto id</th>
<td>
<input type="text" readonly="readonly" name="id_contatto{@id_contatto}" value="{@id_contatto}"/>
</td>
</tr>
<tr>
<xsl:if test="@principale='true' ">
<xsl:attribute name="class">redCss</xsl:attribute>
</xsl:if>
<th>nome</th>
<td>
<input type="text" name="nome{$position}" value="{@nome}"/>
</td>
</tr>
<tr>
<xsl:if test="@principale='true' ">
<xsl:attribute name="class">redCss</xsl:attribute>
</xsl:if>
<th>cognome</th>
<td>
<input type="text" name="cognome{$position}" value="{@cognome}"/>
</td>
</tr>
</xsl:template>
<xsl:template match="/">
<div>
<form action="myform_action" method="post">
<table>
<tbody>
<tr>
<th>username</th>
<td>
<input type="text" name="uid"
value="{/root/Utente[position()=1]/@username}"/>
</td>
<th>password</th>
<td>
<input type="password" name="pwd"
value="{/root/Utente[position()=1]/@password}"/>
</td>
</tr>
<tr>
<th>ruolo</th>
<td>
<select name="role">
<xsl:for-each select="/root/Ruolo">
<xsl:variable name="name" select="@name"/>
<option value="{@name}">
<xsl:if test="count(/root/Utente[position()=1 and
@role=$name]) > 0">
<xsl:attribute
name="selected">selected</xsl:attribute>
</xsl:if>
<xsl:value-of select="@descrizione"/>
</option>
</xsl:for-each>
</select>
</td>
<th>numero contatti</th>
<td>
<xsl:value-of select="count(/root/Node/Contatto[@principale='true'])"/>
</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<xsl:for-each select="/root/Node/Contatto">
<xsl:call-template name="ShowContatto">
<xsl:with-param name="position">
<xsl:value-of select="position()"/>
</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</tbody>
</table>
<table>
<tbody>
<tr>
<xsl:for-each select="/root/Ruolo">
<th>
<xsl:value-of select="@descrizione"/>
</th>
</xsl:for-each>
</tr>
<tr>
<xsl:for-each select="/root/Ruolo">
<td>
<xsl:variable name="name" select="@name"/>
<xsl:for-each select="/root/Utente[@role=$name]">
<xsl:value-of select="@nome"/><xsl:text disable-outputescaping="
yes"> </xsl:text><xsl:value-of select="@cognome"/>
</xsl:for-each>
</td>
</xsl:for-each>
</tr>
</tbody>
</table>
<input type="submit" value="Salva"/>
</form>
</div>
</xsl:template>
</xsl:stylesheet>
Chi mi aiuta? Grazie

12 Risposte

  • Re: XSL applicato all'XML

    Ciao, ho provato la trasformazione ma hai un errore nell'xsl.

    Aggiungi questa riga:
    <?xml-stylesheet type="text/xsl" href="path_del_tuo_xsl.xsl"?>
    dopo:
    <?xml version="1.0" encoding="UTF-8"?>
    Il browser mi segnala che non riesce a interpretarlo.
  • Re: XSL applicato all'XML

    Ho aggiunto la riga come mi dicevi tu
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="path_del_tuo_xsl.xsl"?>
    <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" />
    <xsl:template name="ShowContatto">
    <xsl:param name="position" select="1"/>
    <tr>
    <xsl:if test="@principale='true' ">
    <xsl:attribute name="class">redCss</xsl:attribute>
    </xsl:if>
    <th>contatto id</th>
    <td>
    <input type="text" readonly="readonly" name="id_contatto{@id_contatto}" value="{@id_contatto}"/>
    </td>
    </tr>
    <tr>
    <xsl:if test="@principale='true' ">
    <xsl:attribute name="class">redCss</xsl:attribute>
    </xsl:if>
    <th>nome</th>
    <td>
    <input type="text" name="nome{$position}" value="{@nome}"/>
    </td>
    </tr>
    <tr>
    <xsl:if test="@principale='true' ">
    <xsl:attribute name="class">redCss</xsl:attribute>
    </xsl:if>
    <th>cognome</th>
    <td>
    <input type="text" name="cognome{$position}" value="{@cognome}"/>
    </td>
    </tr>
    </xsl:template>
    <xsl:template match="/">
    <div>
    <form action="myform_action" method="post">
    <table>
    <tbody>
    <tr>
    <th>username</th>
    <td>
    <input type="text" name="uid"
    value="{/root/Utente[position()=1]/@username}"/>
    </td>
    <th>password</th>
    <td>
    <input type="password" name="pwd"
    value="{/root/Utente[position()=1]/@password}"/>
    </td>
    </tr>
    <tr>
    <th>ruolo</th>
    <td>
    <select name="role">
    <xsl:for-each select="/root/Ruolo">
    <xsl:variable name="name" select="@name"/>
    <option value="{@name}">
    <xsl:if test="count(/root/Utente[position()=1 and
    @role=$name]) > 0">
    <xsl:attribute
    name="selected">selected</xsl:attribute>
    </xsl:if>
    <xsl:value-of select="@descrizione"/>
    </option>
    </xsl:for-each>
    </select>
    </td>
    <th>numero contatti</th>
    <td>
    <xsl:value-of select="count(/root/Node/Contatto[@principale='true'])"/>
    </td>
    </tr>
    </tbody>
    </table>
    <table>
    <tbody>
    <xsl:for-each select="/root/Node/Contatto">
    <xsl:call-template name="ShowContatto">
    <xsl:with-param name="position">
    <xsl:value-of select="position()"/>
    </xsl:with-param>
    </xsl:call-template>
    </xsl:for-each>
    </tbody>
    </table>
    <table>
    <tbody>
    <tr>
    <xsl:for-each select="/root/Ruolo">
    <th>
    <xsl:value-of select="@descrizione"/>
    </th>
    </xsl:for-each>
    </tr>
    <tr>
    <xsl:for-each select="/root/Ruolo">
    <td>
    <xsl:variable name="name" select="@name"/>
    <xsl:for-each select="/root/Utente[@role=$name]">
    <xsl:value-of select="@nome"/><xsl:text disable-outputescaping="
    yes"> </xsl:text><xsl:value-of select="@cognome"/>
    </xsl:for-each>
    </td>
    </xsl:for-each>
    </tr>
    </tbody>
    </table>
    <input type="submit" value="Salva"/>
    </form>
    </div>
    </xsl:template>
    </xsl:stylesheet>
    l'errore rimane lo stesso?
  • Re: XSL applicato all'XML

    He He, qua c'è da studiare meglio le basi...
    La riga che ti ho indicato di aggiungere la devi mettere nel file XML non in quello XSL.
    Con quella riga indichi al browser che legge il file xml di renderizzarlo usando la trasformazione XSL in questione.

    Ovviamente "path_del_tuo_xsl.xsl" va sostituito col percorso del file XSL o col solo nome dei file se è presente nella stessa cartella del file XML.

    Per provare il file fai tasto destro sul file xml e poi apri con browser.

    Tutto chiaro?
  • Re: XSL applicato all'XML

    Ti ringrazio, ho fatto quello che hai detto, ho inserito la riga nel file xml, ho cambiato il path nel path del file xsl, ed ho aperto il file xml con IE, solo quello che mi esce è un semplice file xml scritto nel browser. Forse ho sbagliato qualcosa, dimmi te.
  • Re: XSL applicato all'XML

    Si hai sbagliato qualcosa altrimenti vedresti l'errore che ti segnalavo.

    Hai messo correttamente la riga (e il nome del file xsl) che ti dicevo nell'xml?
  • Re: XSL applicato all'XML

    Si, ho inserito la riga che mi hai detto nel file xml sotto <?xml version="1.0" encoding="UTF-8"?>, inserendo il path del documento xsl :<?xml-stylesheet type="text/xsl" href="C:\path_xsl"?>

    Mi sorgono due dubbi: i file vanno rinominato con estensione rispettivamente xml ed xsl?

    L'operazione che mi hai detto di fare è giusta?
  • Re: XSL applicato all'XML

    enrico_84 ha scritto:


    L'operazione che mi hai detto di fare è giusta?
    E secondo te ti davo un consiglio sbagliato?

    Allora:
    1. fai una cartella ipotizziamo c:\test_xml
    2. inserisci entrambi i file in questa cartella e li chiami rispettivamente a.xml e b.xsl
    3. apri a.xml e ci piazzi subito dopo il prologo:
    <?xml-stylesheet type="text/xsl" href="b.xsl"?>
    4. Lanci a.xml col browser

    Il browser tenterà di applicare lo stile ma ti segnalarà un problema per via del documento xsl che ha qualche errore.
  • Re: XSL applicato all'XML

    C'è un altro problema che nn avevo visto, cioè quando vado ad aprire il file .xml col browser, guardando la barra degli indirizzi scopro che il file è stato salvato automaticamente a.xml.txt, cioè è stato messo il .txt in maniera automantica, perciò il browser mi visualizzava un normale file di testo e non quello che dici tu.
    Come faccio a fare in modo che al file venga tolta l'opzione .txt alla fine?
  • Re: XSL applicato all'XML

    Ciao mi sa che hai windows impostato per nascondere le estensioni conosciute.

    Vai su Computer->Organize->folder and search option->View
    Guardati come sono settate le spunte sulle varie voci.
  • Re: XSL applicato all'XML

    Vai su Computer->Organize->folder and search option->View
    Su windows 8 come trovo ciò che mi hai detto?
  • Re: XSL applicato all'XML

    Per Win 8 non so darti indicazioni perchè non l'ho installato.
  • Re: XSL applicato all'XML

    Ho risolto il problema delle estensioni, solo il file xml quando lo apro col browser mi risulta vuoto. E' questo l'errore al quale ti riferivi?
Devi accedere o registrarti per scrivere nel forum
12 risposte