Procesar hoja XSL con parámetros. Ayuda!

oberst
29 de Abril del 2005

Necesito ayuda!

Estoy utilizando ASP para filtrar un documento XML con una hoja XSL capaz de aceptar parámetros para el formateo.

En las pruebas que realizo me sale un documento generado (sin errores) pero no contiene los datos que son de esperar.

Debería aparecer el texto "encontrado!" según la hoja XSL.

Adjunto el fichero XML, la hoja XSL, las rutinas que utilizo para el formateo y la página de invocación.

Gracias de antemano.


Mi documento XML (aviones.xml) tiene la siguiente estructura :
--------------------------------------------------------------

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!-- A continuación definición del DTD en el propio documento -->
<!DOCTYPE FicheroAviones [
<!ELEMENT FicheroAviones (Avion+)>
<!ELEMENT Avion (Imagen*)>
<!ATTLIST Avion id CDATA #REQUIRED>
<!ELEMENT Imagen (URL,Filename,Copyright,URLautor,Comentario)>
<!ATTLIST Imagen Habilitada CDATA #REQUIRED>
<!ATTLIST Imagen IdCategoria CDATA #REQUIRED>
<!ATTLIST Imagen IdImagen CDATA #REQUIRED>
<!ATTLIST Imagen IdOrden CDATA #REQUIRED>
<!ELEMENT URL (#PCDATA)>
<!ELEMENT Filename (#PCDATA)>
<!ELEMENT Copyright (#PCDATA)>
<!ELEMENT URLautor (#PCDATA)>
<!ELEMENT Comentario (#PCDATA)>
]>

<FicheroAviones>
<Avion id='55' >
<Imagen Habilitada='1' IdCategoria='1' IdImagen='55' IdOrden='1' >
<URL>
/PajarosDeGuerra/img/aviones/1_55_1_ar234.jpg
</URL>
<Filename>
1_55_1_ar234.jpg
</Filename>
<Copyright>

</Copyright>
<URLautor>

</URLautor>
<Comentario>

</Comentario>
</Imagen>
<Imagen Habilitada='1' IdCategoria='1' IdImagen='55' IdOrden='2' >
<URL>
/PajarosDeGuerra/img/aviones/1_55_2_ar234b2.jpg
</URL>
<Filename>
1_55_2_ar234b2.jpg
</Filename>
<Copyright>

</Copyright>
<URLautor>

</URLautor>
<Comentario>

</Comentario>
</Imagen>
<Imagen Habilitada='1' IdCategoria='1' IdImagen='55' IdOrden='3' >
<URL>
/PajarosDeGuerra/img/aviones/1_55_3_bw_ar234.jpg
</URL>
<Filename>
1_55_3_bw_ar234.jpg
</Filename>
<Copyright>

</Copyright>
<URLautor>

</URLautor>
<Comentario>

</Comentario>
</Imagen>
</Avion>
</FicheroAviones>


* La hoja de estilo que utilizo para las pruebas es extremadamente simple:
--------------------------------------------------------------------------

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="param1"/>

<xsl:template match="/">
<HTML>
<head></head>
<BODY>
<h2>Prueba de parametros (recibido: <xsl:value-of select="$param1"/>)</h2>
<xsl:apply-templates select="FicheroAviones/Avion[@id=$param1]"/>
</BODY>
</HTML>
</xsl:template>

<xsl:template match="Avion">
<b>Encontrado!</b>
</xsl:template>

</xsl:stylesheet>


* He realizado las pruebas utilizando dos funciones diferentes (obtenidas
de la web) para el proceso y ninguna me da los resultados esperados
--------------------------------------------------------------------------

<%
Function loadXMLFile(strXMLFile, strXSLFile, strOptionalParam1)

'Declare local variables
Dim objXML
Dim objXSL
Dim xslTemplate, xslProc

sourceFile = Server.MapPath(strXMLFile)
styleFile = Server.MapPath(strXSLFile)

' sourceFile = strXMLFile
' styleFile = strXSLFile


'Instantiate the XMLDOM Object that will hold the XML file.
set objXML = Server.CreateObject("Msxml2.DOMDocument")

'Turn off asyncronous file loading.
objXML.async = false

'Load the XML file.
objXML.load(sourceFile)

if Trim(strXSLFile)<>"" then
' FreeThreaded documents are used when creating processors
set objXSL = Server.CreateObject("Msxml2.FreeThreadedDOMDocument")
'Turn off asyncronous file loading.
objXSL.async = false

'Load the XSL file.
objXSL.load(styleFile)

' Create a template made of your XSL file. Much needed for the creation of your processor.
set xslTemplate = Server.CreateObject("Msxml2.XSLTemplate")
' Setting the actual XSL document in the template
xslTemplate.stylesheet = objXSL
' Compile your stylesheet into a processor
set xslProc = xslTemplate.createProcessor()

if (len(Cstr(strOptionalParam1)) > 0) then
xslProc.addParameter "param1", Cstr(strOptionalParam1) ' Add your parameter
end if

xslProc.input = objXML ' The xml input here is actually the xml you want to transform
xslProc.transform() ' Do the transformation
Response.Write(xslProc.output) ' Print the transformed result

else
Response.Write (objXML.transformNode(objXML))

end if


if Err.Number <> 0 then
'ErrorReportingRoutine()
Response.Write "error"
end if
End Function


function processXML (xml, xsl, parname1, par1)
Dim xslTemp, xslDoc, xmlDocument, xslProc
Set xslTemp = Server.CreateObject("Msxml2.XSLTemplate")
Set xslDoc = Server.CreateObject("Msxml2.FreeThreadedDOMDocument")
Set xmlDocument = Server.CreateObject("MSXML2.DOMDocument")
xmlDocument.Load server.mappath (xml)
xslDoc.load server.mappath (xsl)
xslTemp.stylesheet = xslDoc
set xslProc = xslTemp.createProcessor
xslProc.input = xmlDocument
xslProc.addParameter "param1", Cstr(par1)
xslProc.transform
processXML = xslProc.output
end function

%>


Por último adjunto el código de la página desde la que se hace la invocación
a todo este guirigay:
----------------------------------------------------------------------------

<%
' Este documento no puede tener ningún tipo de tag HTML, porque
' sobre él se convierte un XML con su hoja XSL, y por tanto el
' HTML se genera:

Response.Cachecontrol = "no-cache"
Dim XSL_Filename 'Ruta virtual al fichero XSL a usar
Dim XML_Filename 'Ruta virtual al fichero XML a usar

XML_Filename = "aviones.xml"
XSL_Filename = "imagenes_seleccion.xsl"

'He probado estas dos alternativamente y con todo tipo de combinatorias:

'loadXMLFile XML_Filename, XSL_Filename, "55"
Response.Write (processXML(XML_Filename, XSL_Filename, "param1", "55"))
%>