enviar xpath mediante php a xslt

maluka
04 de Julio del 2009
Hola!
Me gustaria saber como se puede pasar un xpath mediante una variable php a un xslt. El codigo que tengo es el siguiente:

ARCHIVO PHP:
<?php
ob_start();

$xml = "nombres.xml";
$xslt = "nombres.xsl";
$xsl = new DomDocument();
$inputdom = new DomDocument();
$xsl->load($xslt);
$inputdom->load($xml);
$proc = new XsltProcessor();
$proc->registerPhpFunctions();

$xsl = $proc->importStylesheet($xsl);

//$tipo=nombre[contains(.//castellano,'Abar')] //Este es el xpath que quiero pasar y no consigo hacerlo
//$proc->setParameter("",'tipo',$tipo);

$newdom = $proc->transformToDoc($inputdom);
print $newdom->saveXML();
ob_end_flush();
?>

ejemplo de archivo nombres.xml:
<nombres>
<nombre>
<castellano>XXX</castellano>
<sexo>G</sexo>
<idiomas>
<ingles>XXX</ingles>
</idiomas>
<idiomas>
<frances>XXX</frances>
</idiomas>
</nombre>
</nombres>

ARCHIVO XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns="http://www.w3.org/1999/xhtml">


<xsl:template match="/nombres">
<html>
<head>
</head>

<body>

<table border ="1">

<tr>
<td> Castellano </td><td> Sexo</td><td> Ingles </td> <td> Frances</td>
</tr>
<xsl:apply-templates select="nombre[contains(.//castellano,'XXX')] ">
QUIERO PARAMETRIZAR ESTA LINEA PARA PODER HACER DIFERENTES BUSQUEDAS

</xsl:apply-templates>


<br/>
</table>
</body>
</html>
</xsl:template>

<xsl:template match="nombre">
<tr>
<xsl:for-each select=".">
<xsl:if test="castellano">
<td><xsl:value-of select="castellano" /> </td>
</xsl:if>
<xsl:if test="sexo">
<xsl:apply-templates select="sexo" />
</xsl:if>
<xsl:if test="idiomas">
<xsl:for-each select="child::*">

<xsl:if test="ingles">
<td><xsl:value-of select="ingles"/> </td>
</xsl:if>
<xsl:if test="frances">
<td><xsl:value-of select="frances" /> </td>
</xsl:if>
</xsl:for-each>
</xsl:if>

</xsl:for-each>
</tr>
</xsl:template>

<xsl:template match="sexo">
<xsl:if test=" . = 'V'">
<td><xsl:text>Varon</xsl:text></td>
</xsl:if>

<xsl:if test=" . = 'M'">
<td><xsl:text>Mujer</xsl:text></td>
</xsl:if>
</xsl:template>

</xsl:stylesheet>

Estos archivos como estan funcionan, lo que quiero es parametrizar ese xpath para poder realizar busquedas con diferentes nombres, o realizar un listado de todos los nombres de chicos ...

Agradecería cualquier sugerencia, gracias!

maluka
04 de Julio del 2009
Lo unico que he conseguido hacer es parametrizar el nombre añadiendo las siguientes lineas:

En el php, despues de esta linea $xsl = $proc->importStylesheet($xsl);

incluyo:
$palabra='Abar';
$proc->setParameter("",'buscar',$palabra);

Los siguientes son intentos fustrados que no funcionan para poner en el select del template
//$a='Abar';
//$a="'".$a."'";
//$palabra='nombre[contains(.//castellano,'.$a .')]';
//$palabra='"'.$palabra.'"';

En el xsl incluyo:

<xsl:param name="buscar" />
<xsl:apply-templates select="nombre[contains(.//castellano,$buscar)] "/>

LO UNICO QUE HE CONSEGIDO HACER! Por fa si alguien sabe como hacerlo...