Passing parameters to XSLT Stylesheet via .NET

限于喜欢 提交于 2019-11-26 09:35:14

问题


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


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



回答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.



来源:https://stackoverflow.com/questions/1521064/passing-parameters-to-xslt-stylesheet-via-net

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!