2009-10-05 4 views
26

Sto provando a passare un parametro a un foglio di stile XSLT, ma tutto quello che sto ottenendo è un documento xml vuoto quando il documento viene trasformato usando XSlCompiledTransform.Passare i parametri al foglio di stile XSLT via .NET

Questo è il metodo C# utilizzato per aggiungere i parametri (dopo l'aggiunta di suggestioni delle persone)

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); 
     } 


    } 

e qui è il foglio di stile. Il parametro che sto passando è '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> 

non posso postare tutto il documento di input come è informazioni confidenziali, ma ecco una breve sterilizzata versione

<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> 

chiunque può aiutare?

Grazie

+0

combinare entrambi @MichaelEdwards e @divo per ottenere la risposta corretta. :) – David

+0

Purtroppo non funziona ancora. Questo è il documento XML risultante MrBliz

+0

Sei sicuro? Non secondo questo articolo: - http://www.xml.com/pub/a/2000/09/13/xslt/index.html – MrBliz

risposta

49

è necessario definire il parametro all'interno del vostro XSLT Ed è anche necessario per passare il XsltArgumentList come argomento per il Transform chiamata:

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); 
    } 
} 

Si prega di notare che il xsl:param devono essere definiti sotto l'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> 

Questo campione XSLT semplice creerà solo un documento di output piccola contenente uno Nodo XML con i suoi contenuti impostati sul valore del parametro. Avere una prova:

<?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

Grazie Divo Ancora non funziona se mi riferisco alla paramter correttamente nel XSL con questa linea MrBliz

+0

Vedere il mio aggiornamento.Se ancora non funziona, per favore pubblica il tuo documento di input Forse il problema è con questo –

+0

Grazie Divo, che effettivamente ha prodotto il parametro desiderato, ma non riesco a capire perché non lo sia lavorando per il mio documento – MrBliz

5

probabilmente è necessario definire il parametro nella parte superiore della XSLT:

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

Vedi questo link

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

Non un grande esempio, ma il migliore che ho potrebbe trovare con un rapido google.

+0

Per qualche motivo, l'overflow dello stack ha mancato il nome del parametro. Modificato la domanda ora. Grazie per il link. . Anche se ancora non funziona; ( – MrBliz