Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352

    Guardate questa trasformazione xml->html: il processore xslt ha un bug???

    Ho un problema con un processore xslt (saxon 6.5.3) che sembra eseguire male l'iterazione con il for; io gli dico di iterare per ogni nodo <item> del nodo corrente e di produrre per ciascuno un blocco[*]...[*] in una lista; ma alla fine mi trovo una lista con molti piu elementi di quelli elencati nel documento xml; se visualizzo il file xml direttamente con Internet Explorer me lo visualizza correttamente, mentre con FireFox ottengo lo stesso risultato di saxon. Questo è il file a.xml:

    codice:
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="a.xsl"?>
    
    <document>
    	<list>
    		<item>1</item>
    		<item>2</item>
    		<item>3</item>
    	</list>
    </document>
    e questo il file a.xsl:

    codice:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:template match="/">
    		<html><body>
    			<xsl:apply-templates select="//list"/>
    		</body></html>
    	</xsl:template>
    
    
    	<xsl:template match="list">
    		<ul>
    			<xsl:for-each select="node()">
    				[*]elemento
    					<xsl:apply-templates select="." />
    				
    			</xsl:for-each>
    		[/list]
    	</xsl:template>
    
    </xsl:stylesheet>
    e il risultato prodotto, notate che tutti li elementi della lista corretti sono intervallati da elementi in piu (nei quali c'è solo il testo 'elemento' senza il numero):

    codice:
    <html>
       <body>
    
          <ul>
    [*]elemento
             
    [*]elemento 1
             
    [*]elemento
             
    [*]elemento 2
             
    [*]elemento
             
    [*]elemento 3
             
    [*]elemento
             
    [/list]
       </body>
    </html>
    Si tratta di un bug o sbalio io a scrivere? Mi sembra di aver letto che saxon è tra i processori piu diffusi, me ne sapete indicare qlcunaltro buono?


  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2003
    Messaggi
    514
    Al posto di node() prova mettere una *

  3. #3
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Si, con * ha funzionato! Ma non capisco perche il mio esempio non funzioni; il manuale dice:

    child::node()— Returns all the children of the context node, no matter what their node type is.

    Tra l'altro ho scaricato anche Xalan e Oxygen e mi fanno la stessa trasformazione di saxon; quindi la situazione è:

    InternetExplorer-XlmSpy ===> interpretano il mio esempio come voglio io

    Saxon-Xalan-FireFox===> agiunono dei nodi supplementari


    Ma mi pare un esempio troppo banale perche tutti e tre producano il risultato sbagliato, allora vorrei sapere perche il mio esempio sarebbe sbagliato.


  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Ho capito cosa succede: con node() si fa il matching anche delle parti di testo, e in particolare degli spazi bianchi che si trovano tra un elemento e l'altro e quindi per ciascun blocco di testo viene prodotto una coppia di[*],


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 © 2025 vBulletin Solutions, Inc. All rights reserved.