Passing parameters to XSLT Stylesheet via .NET

38,174

Solution 1

You need to define the parameter within your XSLT and you also need to pass the XsltArgumentList as an argument to the Transform call:

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

Please note that the xsl:param must be defined below the xsl:stylesheet element:

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

This simple XSLT sample will create just a small output document containing one XML node with its contents set to the value of your parameter. Have a try:

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

Solution 2

you probably need to define the param at the top of the XSLT:

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

See this link

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

Not a great example but the best I could find with a quick google.

Share:
38,174
MrBliz
Author by

MrBliz

Updated on October 06, 2020

Comments

  • MrBliz
    MrBliz over 3 years

    I'm trying to pass a parameter to an XSLT stylesheet, but all i'm getting is an empty xml document when the document is transformed using XSlCompiledTransform.

    This is the C# method used to add the parameters(after adding in people's suggestions)

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

    and here is the stylesheet. The parameter i'm passing in is '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>  
    

    I can't post all of the input document as it's confidential info, but here's a brief sanitised version

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

    Can anyone help?

    Thanks