2009-07-09 21 views
5

En mi sitio web tengo XML con los contenidos de mi página (generados automáticamente desde mi base de datos), que se muestran con XSLT. El problema es este: me gustaría tener algún formato dentro de algunas de las etiquetas XML. Por ejemplo, si tengo un archivo XML que contiene un artículo en un formato así:XSLT: ¿Analizando HTML incrustado en XML?

<article> 
    <header>Cool article</header> 
    <author>Me!</author> 
    <content> 
    This is an article. It's <b>HUGE</b>, and here's a <a href="http://Www.foo.com">link</a>. 
    </content> 
</article> 

Sin embargo, si simplemente obtener el contenido utilizando la siguiente: <xsl:value-of select="content" /> todo el formato HTML se ignora/perdido. Supongo que se confunde con los nodos secundarios XML y no con los datos reales que residen en el nodo de contenido.

¿Cuál es la forma preferida de lograr el formato como se describe aquí?

Gracias de antemano.

+2

[ESTE] (http://stackoverflow.com/questions/4707571/how-can-you-deal-with-embedded-xml-tags-in-xslt) es la respuesta real. Use '' copy-of' en lugar de 'value-of'. –

Respuesta

2

Creo que su problema es el siguiente:

<xsl:output method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" 
      media-type="application/html+xml" encoding="utf-8" omit-xml-declaration="yes" indent="no"/> 

asegurarse de que su salida es de tipo HTML,

application/html 
+0

¡Salud! El método de configuración = "html" lo arregló muy bien. :) – Hallgeir

+0

Estoy contento de poder ayudarte :). – Andrew

0

Codifique su html cuando lo incruste en un elemnet, o use un bloque CDATA para conservar el texto actual. Cualquiera de las dos debería funcionar, aunque dependiendo de dónde se lleve a cabo la Transformación (como el nivel del navegador a través de JS), la salida puede ser diferente con las entidades codificadas.

+0

Hola, esto desafortunadamente hace que las etiquetas aparezcan en texto plano, es decir, no se aplica ningún formato. Lo arreglé usando . Gracias de todos modos – Hallgeir

7
<xsl:value-of select="content" /> 

emite el valor de un nodo. Y el valor de su nodo <content> realidad es:

This is an article. It's HUGE, and here's a link

Lo que probablemente necesita es copia del nodo completo:

<xsl:copy-of select="content" /> 

Esto es en gran parte una conjetura, ya que no sé cómo su el sistema funciona

+1

Saludos, esto fue en parte el problema. :) Utilizando copy-of en lugar de value-of en combinación con lo solucionó. – Hallgeir

+1

Esto también me parece correcto, pero depende de que XHTML esté incrustado en el XML, no solo en HTML. En segundo lugar, copy-of va a generar los contenidos en el espacio de nombres del documento XML fuente original, no el espacio de nombres al que el XSL está generando. A la mayoría de los buscadores web probablemente no les importe, pero si ve un montón de atributos xmlns = "..." en su salida, esta es la razón. –

+1

Publicación antigua, me ayudó ahora. –

0

Puede cambiar la generación de ese archivo XML para poner el contenido en una sección <![CDATA[ ]]>, que le dice al analizador que ignore el contenido especial dentro de esa sección.

+0

Hola, esto lamentablemente hace que las etiquetas aparezcan en texto sin formato, es decir, no se aplica ningún formato. Lo arreglé usando . Gracias de todos modos – Hallgeir

0

Al colocar el código HTML en el documento XML, asegúrese de que cualquier código HTML esté codificado antes de colocarlo en el XML. Por ejemplo.

This is an article. It's <b>HUGE</b>, and here's a <a href="http://Www.foo.com">link</a>. 

se convertiría en:

This is an article. It's &lt;b&gt;HUGE&lt;/b&gt;, and here's a &lt;a href="http://www.foo.com"&gt;link&lt;/a&gt; 

o utilizar un bloque CDATA para que el formato HTML no se pierde.

+0

Hola, esto desafortunadamente hace que las etiquetas aparezcan en texto plano, es decir, no se aplica ningún formato. Lo arreglé usando . Gracias de todos modos – Hallgeir

3
<xsl:value-of 
select="..." 
disable-output-escaping="yes"/> 

Esto funciona en todos los navegadores excepto Firefox.

+0

El XSLT se analiza en el lado del servidor, así que, a menos que me falta algo, el navegador debería ser irrelevante. (Esta fue la solución para mi problema específico, por cierto, ¡gracias!) –

+0

@NathanHornby Los navegadores también pueden analizar XML/XSLT. – ZippyV

+0

¿En qué sentido? . –