2012-10-08 11 views
10

Estoy tratando de pasar un par de parámetros a una hoja de estilos XSLT. He seguido el ejemplo: Passing parameters to XSLT Stylesheet via .NET.Pase el parámetro a la hoja de estilos XSLT

Pero mi página transformada no muestra correctamente el valor.

Aquí está mi código C#. Tuve que agregar una función personalizada para realizar algo de aritmética porque Visual Studio 2010 no usa XSLT 2.0.

var args = new XsltArgumentList(); 
    args.AddExtensionObject("urn:XslFunctionExtensions", new XslFunctionExtensions()); 
    args.AddParam("processingId", string.Empty, processingId); 

    var myXPathDoc = new XPathDocument(claimDataStream); 
    var xslCompiledTransformation = new XslCompiledTransform(true); 

    // XSLT File 
    xslCompiledTransformation.Load(xmlReader); 

    // HTML File 
    using (var xmlTextWriter = new XmlTextWriter(outputFile, null)) 
    { 
     xslCompiledTransformation.Transform(myXPathDoc, args, xmlTextWriter); 
    } 

Aquí es mi XSLT:

<xsl:template match="/"> 
    <xsl:param name="processingId"></xsl:param> 
    ..HTML.. 
    <xsl:value-of select="$processingId"/> 

Me estoy perdiendo algo?

+0

¿Tiene '' en el nivel superior? Parece que define su parámetro dentro de una plantilla que creará un parámetro local. Para los parámetros externos, el parámetro debe ser global, por lo que debe definirse en el mismo nivel que xsl: template elements – Pawel

+0

No estoy seguro de lo que quiere decir en el nivel superior. La definición del parámetro está debajo del como pegué en mi pregunta. Encima de eso está la etiqueta . – coson

+0

Quise decir que no debería estar dentro de xsl: plantilla. Pruebe algo como esto: ' ... ' – Pawel

Respuesta

15

Aquí es mi XSLT:

<xsl:template match="/">  
    <xsl:param name="processingId"></xsl:param>  
    ..HTML..  
    <xsl:value-of select="$processingId"/> 

Me estoy perdiendo algo?

Sí, se echa en falta el hecho de que el invocador de una transformación XSLT puede establecer los valores de a nivel mundial parámetros - no los valores de los parámetros a nivel de plantilla.

Por lo tanto, el código debe ser:

<xsl:param name="processingId"/>  

<xsl:template match="/">  
    ..HTML..  
    <xsl:value-of select="$processingId"/> 
    <!-- Possibly other processing here --> 
</xsl:template> 
+2

Esto es realmente una cosa muy útil, ¿alguien sabe si esto también se puede hacer usando Java? – adam5990

+0

@ adam5990, Sí, en caso de que el procesador XSLT particular esté escrito en Java. La forma de especificar los valores de los parámetros globales de forma programática es específica de la implementación y varía desde el procesador XSLT hasta el procesador XSLT. Ver, por ejemplo, esta sección de la documentación sajona: saxonica.com/documentation/#!using-xsl/embedding/.... En particular, dice (en el punto 1): "Puede usar métodos en XsltTransformer para establecer valores para parámetros de hojas de estilo globales". Sin embargo, tenga en cuenta que es mucho más fácil hacerlo manualmente, invokinf una transformación XSLT de la orden- línea. –

Cuestiones relacionadas