PDA

View Full Version : [XML + XSLT] Per favore schiaritemi le idee


VegetaSSJ5
24-06-2005, 11:37
Devo trasformare un file xml in una pagina xhtml. Vorrei scrivere tutto a parole ma non ci si capirebbe nulla, così metto direttamente l'esempio, che cmq è corto. Questo è il codice XML:<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>

<documento>
<header>
Lasagna allo scoglio
</header>
</documento>E questo è il file di trasformazione XSLT:<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">

<xsl:template match="/">
<html>
<head>
<title>Pagina di prova</title>
<meta name="description" content="Pagina XHTML per la prova parziale di SID" />
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="./style.css" type="text/css" />
</head>
<body style="background-color: #eee;">
<div id="content">
<xsl:apply-templates select="document/header" />
</div>
</body>
</html>
</xsl:template>

<xsl:template match="header">
<div id="header" style="font-size: 32px;">
<xsl:value-of select="current()" />
</div>
</xsl:template>
</xsl:stylesheet>Perchè quando richiamo l'apply-templates scegliendo il nodo "document/header" oppure "/document/header" non succede niente invece se scelgo "//header" fa match e inserisce regolarmente il testo? L'espressione // non significa il successore del nodo corrente (che al momento della chiamata era il nodo root /) e quindi il discendente di root è document?

texerasmo
24-06-2005, 13:23
allora // significa in qualsiai livello perciò te la prende

quella current() che dovrebbe fare?

texerasmo
24-06-2005, 13:32
se devi farti stampare
Lasagna allo scoglio


<xsl:template match="document">
......
<xsl:apply-templates select="header" />

....
</xsl:template>

<xsl:template match="header">
<div id="header" style="font-size: 32px;">
<xsl:value-of select="." />
</div></xsl:template>


prova così
oppure correggi in questo modo

<xsl:template match="document/header">
<div id="header" style="font-size: 32px;">
<xsl:value-of select="." />
</div>
</xsl:template>

fammi sapere

VegetaSSJ5
24-06-2005, 13:48
grazie texerasmo per essere intervenuto. dunque il problema è che document è il tag root del documento xml. nel documento xsl comincio con un <xsl:template match="/"> quindi l'elemento document è figlio di /. in pratica io vorrei fare direttamente

<xsl:apply-templates select="/document/header" />

senza ricorrere ad un

<xsl:template match="document">
......
<xsl:apply-templates select="header" />

....
</xsl:template>

perchè in document ci sono solo altri figli e non mi serve di manipolarlo direttamente in una propria template. però quell'apply-templates select="/document/header" non funziona! eppure mi sembra che sia scritto correttamente... boh!

P.S.
current() in xpath indica il nodo corrente, però visto che tu mi hai indicato il "." d'ora in poi userò quello, è più maneggevole... ;)