2010-10-14 13 views
11

necesito mostrar HTML-elemento en los comentarios (por ejemplo)elemento de salida en los comentarios

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

utilizo este enfoque

<?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> 

Como resultado:

<!----> 

que es el código en el elemento xsl:comment ignorado.

¿Cómo se muestra un elemento en los comentarios?

+0

Buena pregunta, +1. Vea mi respuesta para una explicación detallada y tres enfoques posibles, dependiendo de la tarea específica. –

+0

Acabo de editar mi respuesta y creo que ahora tiene la solución que desea. ¿Es esto así? –

Respuesta

10

Podría ser posible reemplazar

<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>

no has probado sin embargo.

1

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

El elemento xsl: comentario se crea una instancia para crear un comentario nodo en el árbol resultado. El contenido del elemento xsl: comment es una plantilla para el valor de cadena del nodo de comentario.

Por ejemplo, este

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

crearía el comentario

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

Es un error si una instancia del contenido de XSL: comentario crea nodos distinta nodos de texto. Un procesador XSLT puede señalar el error; si no indica el error, se debe recuperar ignorando los nodos ofensivos junto con su contenido.

Es un error si el resultado de instanciar el contenido de la XSL: comentario contiene la cadena -- o termina con -. Un procesador XSLT puede señalar el error; si no indica el error, debe recuperar por insertando un espacio después de cualquier ocurrencia de - que va seguido de otra - o o que finaliza el comentario.

Por lo tanto, para hacer lo que necesita, necesita utilizar el mecanismo DOE.

Como ejemplo, esta hoja de estilo:

<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 esta entrada:

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

de salida:

<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 función de extensión para dos transformación pase. disable-output-escaping atributo para xsl:value-of instrucción.

+0

@Alejandro: No puedo usar 'node-set' en nuestro proyecto (no tengo manera de activar esta función) – Kalinin

+0

@Kalinin: El uso de la función de extensión' node-set' es una transformación de dos pasos, no se trata de Necesitas: inhabilitar el escape de salida para que el carácter '<' no se muestre como una referencia de entidad '<'. Por supuesto, si no utiliza una transformación de dos pasos, debe compilar la plantilla contente para sus "pseudoelementos" de la misma manera que lo hice en esas plantillas de "codificación" de modo. Además, estoy seguro de que su procesador tiene la función de extensión 'node-set' pero en un espacio de nombres diferente. ¿Qué procesador XSLT usas? –

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

Como resultado:

<!----> 

que es el código en el elemento XSL : Comentario ignorado

The XSLT 1.0 Spec dice:

Es un error si la creación de instancias del contenido de xsl: comment crea nodos que no sean nodos de texto. Un procesador XSLT puede señalar el error; si no indica el error, se debe recuperar ignorando los nodos ofensivos junto con su contenido.

¿Cómo se muestra un artículo en los comentarios ?

que depende de lo que se entiende por "pantalla": en un navegador:

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

puede ser útil, siempre y cuando el resultado de <xsl:apply-templates/> aboveis acaba de texto sencillo (no marcas).

Si la "pantalla" se refiere a proporcionar el resultado como texto, a continuación, DOE, si lo permite el procesador XSLT, puede darnos el resultado deseado:

< - Parte del texto - >

Finalmente, si se requiere que lo que debería estar dentro del "comentario" deba marcarse y se debe mostrar como marcado, entonces esto es bastante desafiante. En este caso hay que utilizar:

<xsl:output method="text"/> 

y deben presentar cada elemento léxico XML con su serialización deseada (es decir escapado).

Así es como XPath Visualizer construye su salida.

Aquí está una pequeña transformación que demuestra los dos primeros enfoques:

<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> 

esta transformación, cuando se aplica sobre cualquier documento XML (no se utiliza), produce:

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

    <-- 
    Hello,world! --> 

Ambos "comentarios" pueden verse como comentarios en un navegador, mientras que solo el segundo se presenta como comentario en texto libre.

El tercer enfoque (muy probablemente lo que quiere) se ilustra a continuación:

<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> 

cuando se aplica esta transformación en el siguiente documento XML:

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

la quería resultado es producido:

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

visualiza en un navegador como:

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

0

Como dijimos antes por Dimitri, no puede usar la instrucción xsl: comment.

Si su propósito es simplemente para comentar un fragmento de árbol, la forma más sencilla es poner los comentarios marcadores como texto (formato de escape) así:

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

en lugar de:

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

y obtendrá exactamente esto

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

utilizado con msxml y Saxon

+0

No veo cómo esta respuesta difiere de http://stackoverflow.com/a/3933175/272735 – user272735

Cuestiones relacionadas