Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing parameters to XSLT Stylesheet via .NET

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

like image 261
MrBliz Avatar asked Oct 05 '09 16:10

MrBliz


People also ask

How do you use parameters in XSLT?

To use an XSLT parameterCreate an XsltArgumentList object and add the parameter using the AddParam method. Call the parameter from the style sheet. Pass the XsltArgumentList object to the Transform method.

How do you link an XSLT stylesheet to an XML document?

Link the XSL Style Sheet to the XML DocumentAdd the XSL style sheet reference to your XML document ("cdcatalog. xml"): <? xml version="1.0" encoding="UTF-8"?>

Can we use XQuery in XSLT?

For example, you can use XQuery to extract data from an XML database, and XSLT to present the results to users on the web.

Can you use CSS with XSLT?

An XSLT style sheet can emit HTML <STYLE> elements, including CSS specifications, directly into the HTML that results from the XSLT transformation. This option works best when the number of CSS rules is small and easily managed.


1 Answers

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> 
like image 183
Dirk Vollmar Avatar answered Sep 19 '22 20:09

Dirk Vollmar