通过 .NET 将参数传递给 XSLT 样式表

Posted

技术标签:

【中文标题】通过 .NET 将参数传递给 XSLT 样式表【英文标题】:Passing parameters to XSLT Stylesheet via .NET 【发布时间】:2010-12-04 00:17:14 【问题描述】:

我正在尝试将参数传递给 XSLT 样式表,但是当使用 XSlCompiledTransform 转换文档时,我得到的只是一个空的 xml 文档。

这是用于添加参数的C#方法(在添加了人们的建议后)

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


    

这是样式表。我传入的参数是'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>  

我不能发布所有输入文档,因为它是机密信息,但这里有一个简短的净化版本

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

谁能帮忙?

谢谢

【问题讨论】:

结合@MichaelEdwards 和@divo 以获得正确答案。 :) 遗憾的是,它仍然无法正常工作。这是生成的 XML 文档 你确定吗?不是根据这篇文章:-xml.com/pub/a/2000/09/13/xslt/index.html 【参考方案1】:

您需要在 XSLT 中定义参数,还需要将 XsltArgumentList 作为参数传递给 Transform 调用:

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

请注意xsl:param 必须定义在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>

这个简单的 XSLT 示例将创建一个小的输出文档,其中包含一个 XML 节点,其内容设置为您的参数值。试一试:

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

【讨论】:

谢谢迪沃。仍然无法正常工作。我是否在 XSL 中正确引用了这一行中的参数? 查看我的更新。如果仍然无法正常工作,请发布您的输入文档。也许问题就出在这上面。 感谢 Divo,这确实产生了所需的参数,但我不明白为什么它不适用于我的文档。 再次感谢迪沃。如果我手动添加我想要的参数(即;用“9”交换 Boss_ID 并对方法进行必要的更改,那么文档就很好了。我将添加输入文档 魔术!没有看到关于在模板之外定义参数的编辑。非常感谢!【参考方案2】:

您可能需要在 XSLT 顶部定义参数:

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

查看此链接

http://projects.ischool.washington.edu/ta***s/545/2004Autumn/ContentManagement/PassingParameters.htm

不是一个很好的例子,但我可以通过快速谷歌找到最好的例子。

【讨论】:

由于某种原因堆栈溢出错过了参数名称。现在编辑问题。感谢您的链接。虽然还是不行;(

以上是关于通过 .NET 将参数传递给 XSLT 样式表的主要内容,如果未能解决你的问题,请参考以下文章

如何通过asp.net schtasks将参数传递给bat文件

如何从.net代码将表值参数传递给存储过程

如何将多个参数传递给 ASP.NET CORE MVC 中的 HttpGet 方法?

嵌套表单 - 我无法将所有属性参数传递给我的强参数

使用XSLT检索XML文件名

将表值参数传递给存储过程