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
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.
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"?>
For example, you can use XQuery to extract data from an XML database, and XSLT to present the results to users on the web.
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.
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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With