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

33

我正在尝试向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结合起来,就能得到正确的答案。 :) - David
不幸的是,即使已经这样做了,它仍然无法工作。这是生成的XML文档<?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="..\styles\orgcharts.xsl" ?> <OrgDoc /> - MrBliz
你确定吗?根据这篇文章并不是这样的:- http://www.xml.com/pub/a/2000/09/13/xslt/index.html - MrBliz
2个回答

60

您需要在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>

谢谢Divo。不过还是没有起作用。我在XSL中使用这行代码正确地引用了参数吗?<xsl:for-each select="PosDets[@OC_Man = $Boss_ID]"> - MrBliz
请查看我的更新。如果仍然无法正常工作,请发布您的输入文档。也许问题就出在那里。 - Dirk Vollmar
谢谢Divo,确实产生了所需的参数,但我不明白为什么它对我的文档不起作用。 - MrBliz
再次感谢divo。如果我手动添加我想要的参数(即用“9”替换Boss_ID并对该方法进行必要的更改),那么文档就会出现。我会添加输入文档。 - MrBliz
你确定你在模板外定义了xsl:param吗?我这边输入的文档可以正常通过转换。 - Dirk Vollmar
显示剩余2条评论

6

由于某些原因,Stack Overflow 没有包含参数名称。现在已编辑问题。感谢提供的链接。虽然仍然无法工作 ;( - MrBliz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接