XSLT: il comando text e l'output-escaping
A volte nello scrivere l'output di una trasformazione XSLT fa comodo anche generare del testo. Sembra una cosa normale, e tuttosommato anche facile.
In effetti è così, salvo quando per esempio vogliamo preservare dei caratteri in output, o vogliamo scrivere degli spazi o dei simboli di "a capo" che devono essere mantenuti come tali.
Il comando text serve per forzare in output del testo a nostra scelta, per esempio uno spazio, che altrimenti sarebbe ignorato di default dal parser. Inoltre possiamo chiedere al comando text, così come anche al comando value-of di disabilitare l'output-escaping. Che significa? Significa che se noi passiamo dei caratteri che in output sarebbe necessario presentare con dei simboli di escape come < ed > per esempio al posto di > e <, il comando produrrà invece in output proprio > e <.
Quando ci può servire? Un caso tipico è quando vogliamo scrivere in output del codice HTML letto dal contenuto di un nodo o di un attributo.
Pensiamo al seguente XML:
<?xml version="1.0"?>
<documento>
<titolo>Titolo del documento</titolo>
<contenuto>
<p>Questo è un paragrafo HTML letto da un DB
o da qualunque altra fonte e scritto nel tag di nome
<i>contenuto</i> come HTML Encoded. In output
vogliamo però averlo come HTML normale</p>
</contenuto>
</documento>
Per ottenere in output:
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-16">
<title>Titolo del documento</title>
</head>
<body>
<p>Questo è un paragrafo HTML letto da un DB
o da qualunque altra fonte e scritto nel tag di nome
<i>contenuto</i> come HTML Encoded. In output
vogliamo però averlo come HTML normale</p>
</body>
</html>
dovremo dire alla trasformazione XSLT:
<?xml version="1.0"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />
<xsl:template match="/">
<html>
<head>
<title><xsl:value-of select="documento/titolo" /></title>
</head>
<body>
<xsl:value-of select="documento/contenuto" disable-output-escaping="yes" />
</body>
</html>
</xsl:template>
</xsl:transform>
http://www.devleap.com/Downloads/Blogs/Paolo/TutorialXSLT/documento.xml
http://www.devleap.com/Downloads/Blogs/Paolo/TutorialXSLT/documento.xslt