2009-10-05 12 views
26

Estoy tratando de pasar un parámetro a una hoja de estilo XSLT, pero todo lo que obtengo es un documento xml vacío cuando el documento se transforma utilizando XSlCompiledTransform.Pasando parámetros a la hoja de estilo XSLT a través de .NET

Este es el método de C# se utiliza para agregar los parámetros (después de la adición de sugerencias de la gente)

private static void CreateHierarchy(string manID) 
    { 

     string man_ID = manID; 

     XsltArgumentList argsList = new XsltArgumentList(); 
     argsList.AddParam("Boss_ID","",man_ID); 

     XslCompiledTransform transform = new XslCompiledTransform(); 
     transform.Load("htransform.xslt"); 

     using (StreamWriter sw = new StreamWriter("output.xml")) 
     { 
      transform.Transform("LU AIB.xml", argsList, sw); 
     } 


    } 

y aquí está la hoja de estilo. El parámetro que estoy pasando es 'Boss_ID'

<?xml version="1.0" encoding="utf-8"?> 
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="OrgDoc"> 
    <xsl:param name="Boss_ID"></xsl:param> 
    <xsl:processing-instruction name="xml-stylesheet"> 
    <xsl:text>type="text/xsl" href="..\styles\orgcharts.xsl" </xsl:text> 
    </xsl:processing-instruction> 
    <OrgDoc> 
     <xsl:for-each select="PosDets[@OC_Man = $Boss_ID]"> 
     <PosDets OC_Pos="{@OC_Pos}" OC_Sub="{@OC_Sub}" OC_Man="{@OC_Man}" OC_Ttl="{@OC_Ttl}" OC_Rnk="{@OC_Rnk}" OC_Bdg="{@OC_Bdg}" OC_Fnd="{@OC_Fnd}" OC_OL3="{@OC_OL3}" OC_Tmp="{@OC_Tmp}"> 
      <xsl:apply-templates select="../PosDets"> 
      <xsl:with-param name="mgrid" select="@OC_Pos"/> 
      </xsl:apply-templates> 
     </PosDets> 
     </xsl:for-each> 
    </OrgDoc> 
    </xsl:template> 
    <xsl:template match="PosDets" > 
    <xsl:param name="mgrid" /> 
    <xsl:if test="@OC_Man=$mgrid" > 
     <PosDets OC_Pos="{@OC_Pos}" OC_Sub="{@OC_Sub}" OC_Man="{@OC_Man}" OC_Ttl="{@OC_Ttl}" OC_Rnk="{@OC_Rnk}" OC_Bdg="{@OC_Bdg}" OC_Fnd="{@OC_Fnd}" OC_OL3="{@OC_OL3}" OC_Tmp="{@OC_Tmp}"> 
     <xsl:apply-templates select="../PosDets"> 
      <xsl:with-param name="mgrid" select="@OC_Pos"/> 
     </xsl:apply-templates> 
     </PosDets> 
    </xsl:if> 
    </xsl:template> 


    </xsl:stylesheet> 

no puedo publicar la totalidad del documento de entrada, ya que es información confidencial, pero aquí está una breve desinfectado versión

<OrgDoc><PosDets OC_Pos="161" OC_Man="9" OC_Ttl="Boss" OC_Rank="" OC_OL3="LU AIB" OC_Bdg="Has Budget" OC_Fnd="Payroll" OC_Sub="" OC_Tmp="" /><PosDets OC_Pos="190" OC_Man="161" OC_Ttl="Boss" OC_Rank="" OC_OL3="LU AIB" OC_Bdg="Has Budget" OC_Fnd="Payroll" OC_Sub="" OC_Tmp="" /><PosDets OC_Pos="199" OC_Man="190" OC_Ttl="Boss" OC_Rank="" OC_OL3="LU AIB" OC_Bdg="Has Budget" OC_Fnd="Payroll" OC_Sub="" OC_Tmp="" /></OrgDoc> 

¿Alguien puede ayudar?

Gracias

+0

Combina @MichaelEdwards y @divo para obtener la respuesta correcta. :) – David

+0

Tristemente haber hecho eso todavía no está funcionando. Este es el documento XML resultante MrBliz

+0

¿Estás seguro? No de acuerdo con este artículo: - http://www.xml.com/pub/a/2000/09/13/xslt/index.html – MrBliz

Respuesta

49

es necesario definir el parámetro dentro de su XSLT y también tiene que pasar el XsltArgumentList como un argumento a la Transform llamada:

private static void CreateHierarchy(string manID) 
{ 
    string man_ID = manID; 

    XsltArgumentList argsList = new XsltArgumentList(); 
    argsList.AddParam("Boss_ID", "", man_ID); 

    XslCompiledTransform transform = new XslCompiledTransform(true); 
    transform.Load("htransform.xslt"); 

    using (StreamWriter sw = new StreamWriter("output.xml")) 
    { 
     transform.Transform("LU AIB.xml", argsList, sw); 
    } 
} 

Tenga en cuenta que el xsl:param debe definirse por debajo del elemento xsl:stylesheet:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:param name="Boss_ID"></xsl:param> 

    <xsl:template match="OrgDoc"> 

    <!-- template body goes here --> 

    </xsl:template> 


</xsl:stylesheet> 

Este sencillo ejemplo XSLT creará sólo un documento de salida que contiene una pequeña Nodo XML con su contenido configurado en el valor de su parámetro. Pruébalo:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:param name="Boss_ID"></xsl:param> 

    <xsl:template match="/"> 
    <out> 
     <xsl:value-of select="$Boss_ID" /> 
    </out> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Gracias Divo Todavía no funciona aunque me refiero a la parametro correctamente en el XSL con esta línea MrBliz

+0

Ver mi actualización. Si aún no funciona, publique su documento de entrada. Tal vez el problema es con eso. –

+0

Gracias a Divo, que efectivamente produjo el parámetro deseado, pero no puedo entender por qué no lo está trabajando para mi documento. – MrBliz

5

es probable que necesite para definir el parámetro en la parte superior de la XSLT:

<xsl:param name="Boss_ID" /> 
<OrgDoc> 
//rest of the XSLT 
</OrgDoc> 

Vea este enlace

http://projects.ischool.washington.edu/tabrooks/545/2004Autumn/ContentManagement/PassingParameters.htm

No es un gran ejemplo, pero lo mejor que podría encontrar con un Google rápido.

+0

Por algún motivo, el desbordamiento de la pila omitió el nombre del parámetro. Editó la pregunta ahora. Gracias por el enlace. . Aunque aún no funciona; ( – MrBliz

Cuestiones relacionadas