通过 .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 中正确引用了这一行中的参数?您可能需要在 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文件