2010-10-14 14 views
11

ho bisogno di visualizzare elemento HTML nei commenti (per esempio)elemento di uscita nei commenti

<!-- <img src="path" width="100px" height="100px"/> --> 

Io uso questo approccio

<?xml version="1.0" encoding="windows-1251"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" indent="no" encoding="windows-1251"/> 

    <xsl:template match="myNode"> 
     ... 
     <xsl:comment><xsl:apply-templates select="image" /></xsl:comment> 
     ... 
    </xsl:template> 

    <xsl:template match="image"> 
     <img src="{@src}" width="{@width}px" height="{@height}px" /> 
    </xsl:template> 

</xsl:stylesheet> 

Come risultato:

<!----> 

che è il codice nell'elemento xsl:comment ignorato.

Come faccio a visualizzare un elemento nei commenti?

+0

Buona domanda, +1. Vedi la mia risposta per una spiegazione dettagliata e tre possibili approcci, a seconda del compito specifico. –

+0

Ho appena modificato la mia risposta e penso che ora ha la soluzione che desideri. È così? –

risposta

10

Potrebbe essere possibile per sostituire

<xsl:comment><xsl:apply-templates select="image" /></xsl:comment>

con

<xsl:text disable-output-escaping="yes">&lt;!--</xsl:text>
<xsl:apply-templates select="image" />
<xsl:text disable-output-escaping="yes">--&gt;</xsl:text>

Non hanno provato però.

1

Da http://www.w3.org/TR/xslt#section-Creating-Comments:

Il xsl: commento elemento viene creata un'istanza per creare un nodo commentare nel albero risultato. Il contenuto dell'elemento xsl: comment è un modello per il valore stringa del nodo commento.

Ad esempio, questo

<xsl:comment>This file is automatically generated. Do not edit!</xsl:comment>

creerebbe il commento

<!--This file is automatically generated. Do not edit!-->

Si tratta di un errore se un'istanza il contenuto di xsl: commento crea nodi diverso nodi di testo. Un processore XSLT può segnalare l'errore; se non segnala l'errore, esso deve recuperare ignorando l'incriminato nodi insieme al loro contenuto.

Si tratta di un errore se il risultato della istanziare il contenuto del xsl: commento contiene la stringa -- o termina con -. Un processore XSLT può segnalare l'errore; se non invia l'errore , è necessario ripristinare inserendo uno spazio dopo l'occorrenza di - seguito da un altro - o che termina il commento.

Quindi, per fare ciò che vuoi è necessario utilizzare il meccanismo DOE.

Come esempio, questo foglio di stile:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
exclude-result-prefixes="msxsl"> 
    <xsl:output method="html" indent="no" encoding="windows-1251"/> 
    <xsl:template match="img"> 
     <img src="{.}"/> 
    </xsl:template> 
    <xsl:template match="root"> 
     <xsl:variable name="vResult"> 
      <xsl:apply-templates/> 
     </xsl:variable> 
     <html> 
      <xsl:copy-of select="$vResult"/> 
      <xsl:comment> 
       <xsl:apply-templates select="msxsl:node-set($vResult)" 
            mode="encode"/> 
      </xsl:comment> 
     </html> 
    </xsl:template> 
    <xsl:template match="*" mode="encode"> 
     <xsl:value-of select="concat('&lt;',name())" 
         disable-output-escaping="yes"/> 
     <xsl:apply-templates select="@*" mode="encode"/> 
     <xsl:text>></xsl:text> 
     <xsl:apply-templates mode="encode"/> 
     <xsl:value-of select="concat('&lt;',name(),'>')" 
         disable-output-escaping="yes"/> 
    </xsl:template> 
    <xsl:template match="*[not(node())]" mode="encode"> 
     <xsl:value-of select="concat('&lt;',name())" 
         disable-output-escaping="yes"/> 
     <xsl:apply-templates select="@*" mode="encode"/> 
     <xsl:text>/></xsl:text> 
    </xsl:template> 
    <xsl:template match="@*" mode="encode"> 
     <xsl:value-of select="concat(' ',name(),'=&quot;',.,'&quot;')"/> 
    </xsl:template> 
</xsl:stylesheet> 

Con questo ingresso:

<root> 
    <img>http://example.org/image1.jpg</img> 
    <img>http://example.org/image2.jpg</img> 
    <img>http://example.org/image3.jpg</img> 
</root> 

uscita:

<html> 
    <img src="http://example.org/image1.jpg"> 
    <img src="http://example.org/image2.jpg"> 
    <img src="http://example.org/image3.jpg"> 
    <!--<img src="http://example.org/image1.jpg"/> 
     <img src="http://example.org/image2.jpg"/> 
     <img src="http://example.org/image3.jpg"/>--> 
</html> 

Nota: node-set funzione di estensione per due trasformazione pass. Attributo disable-output-escaping per l'istruzione xsl:value-of.

+0

@Alejandro: Non posso usare 'node-set' nel nostro progetto (non ho modo di attivare questa funzione) – Kalinin

+0

@Kalinin: L'uso della funzione di estensione' node-set' è di circa due passaggi di trasformazione, non si tratta di cosa è necessario: disabilitare l'escaping dell'output in modo che il carattere <

7
<xsl:comment><xsl:apply-templates select="image" /></xsl:comment> 

Come risultato:

<!----> 

che è il codice nell'elemento xsl: Commento ignorato

The XSLT 1.0 Spec dice:

Si tratta di un errore durante l'istanziazione del contenuto di xsl: il commento crea nodi diversi dai nodi di testo. Un processore XSLT può segnalare l'errore; se non segnala l'errore, è necessario eseguire il ripristino ignorando i nodi in conflitto con il loro contenuto.

Come visualizzare un elemento nei commenti ?

Dipende da cosa si intende per "esposizione": in un browser:

&lt;-- <xsl:apply-templates select="image" /> --> 

può essere utile, a condizione che il risultato di <xsl:apply-templates/> aboveis testo solo semplice (non markup).

Se a "schermo" significa per fornire il risultato come testo, quindi DOE, se consentito dal processore XSLT, può darci il risultato desiderato:

< - Alcuni testi - >

Infine, se è necessario che quello che dovrebbe essere all'interno del "commento" dovrebbe essere marcato e dovrebbe essere visualizzato come markup, allora questo è piuttosto impegnativo. In questo caso si deve usare:

<xsl:output method="text"/> 

e dovrebbe presentare ogni elemento lessicale XML con la sua serializzazione desiderato (vale a dire sfuggito).

Ecco come XPath Visualizer costruisce l'output.

Ecco una piccola trasformazione che dimostra i primi due approcci:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
     &lt;-- Hello, World --> 

    <xsl:text disable-output-escaping="yes">&lt;--</xsl:text> 
    Hello,world! --<xsl:text disable-output-escaping="yes">&gt;</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

questa trasformazione, quando applicato su qualsiasi documento XML (non utilizzato), produce:

 &lt;-- Hello, World --&gt; 

    <-- 
    Hello,world! --> 

Entrambi i "commenti" possono essere visualizzati come commenti in un browser, mentre solo il secondo viene presentato come commento in testo libero.

Il terzo approccio (più probabilmente quello che volete) è illustrata di seguito:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    &lt;-- <xsl:apply-templates select="image"/> --> 

</xsl:template> 

<xsl:template match="image"> 
    &lt;img src="<xsl:value-of select="@src"/>" 
     width="<xsl:value-of select="@width"/>px" 
     height="<xsl:value-of select="@height"/>px"/> 
</xsl:template> 
</xsl:stylesheet> 

quando questa trasformazione è applicato sul seguente documento XML:

<image src="http://example.com/yyy.jpg" width="200" height="300"/> 

l'ha voluto il risultato è prodotto:

&lt;-- 
    &lt;img src="http://example.com/yyy.jpg" 
     width="200px" 
     height="300px"/&gt; 
    --&gt; 

visualizzato in un browser come:

< - < img src = "http://example.com/yyy.jpg" width = "200px" height = "300px"/> - >

0

Come già detto da Dimitri non è possibile utilizzare l'istruzione xsl: comment.

Se il vostro scopo è semplicemente quello di lasciare un commento, un frammento di albero, il modo più semplice è quello di mettere i commenti marcatori come testo (escape) in questo modo:

<xsl:text disable-output-escaping="yes">&lt;!--</xsl:text><xsl:apply-templates select="image" /><xsl:text disable-output-escaping="yes">--&gt;</xsl:text> 

invece di:

<xsl:comment><xsl:apply-templates select="image" /></xsl:comment> 

e otterrete esattamente questo

<!-- <img src="path" width="100px" height="100px"/> --> 

usato con MSXML e saxon

+0

Non riesco a vedere come questa risposta differisce da http://stackoverflow.com/a/3933175/272735 – user272735

Problemi correlati