2012-10-08 118 views
10

我想将几个参数传递给XSLT样式表。我遵循了这个例子:Passing parameters to XSLT Stylesheet via .NET将参数传递给XSLT样式表

但我的转换后的页面没有正确显示值。

这是我的C#代码。我不得不添加一个自定义函数来执行某些算术,因为Visual Studio 2010不使用XSLT 2.0。

var args = new XsltArgumentList(); 
    args.AddExtensionObject("urn:XslFunctionExtensions", new XslFunctionExtensions()); 
    args.AddParam("processingId", string.Empty, processingId); 

    var myXPathDoc = new XPathDocument(claimDataStream); 
    var xslCompiledTransformation = new XslCompiledTransform(true); 

    // XSLT File 
    xslCompiledTransformation.Load(xmlReader); 

    // HTML File 
    using (var xmlTextWriter = new XmlTextWriter(outputFile, null)) 
    { 
     xslCompiledTransformation.Transform(myXPathDoc, args, xmlTextWriter); 
    } 

这里是我的XSLT:

<xsl:template match="/"> 
    <xsl:param name="processingId"></xsl:param> 
    ..HTML.. 
    <xsl:value-of select="$processingId"/> 

我这么想吗?

+0

你有'的'在顶层?似乎你在一个将创建一个本地参数的模板中定义你的参数。对于外部参数,参数必须是全局的,所以它必须定义在与xsl相同的级别:模板元素 – Pawel

+0

我不确定您在顶层的含义。当我在我的问题中粘贴时,参数定义低于。上面是标签。 – coson

+0

我的意思是它不应该在xsl:template中。尝试这样: ' ...' – Pawel

回答

15

这里是我的XSLT:

<xsl:template match="/">  
    <xsl:param name="processingId"></xsl:param>  
    ..HTML..  
    <xsl:value-of select="$processingId"/> 

我这么想吗?

是的,你缺少的事实,XSLT转换的调用者可以设置全球级参数的值 - 不是模板级别参数的值。

因此,代码必须是:

<xsl:param name="processingId"/>  

<xsl:template match="/">  
    ..HTML..  
    <xsl:value-of select="$processingId"/> 
    <!-- Possibly other processing here --> 
</xsl:template> 
+2

这实际上是一个非常方便的知道,任何人都知道如果这也可以使用Java来完成? – adam5990

+0

@ adam5990,是的,如果使用的特定XSLT处理器是用Java编写的。以编程方式指定全局参数值的方法是特定于实现的,并且从XSLT处理器到XSLT处理器各不相同。请参阅Saxon文档的这一部分:saxonica.com/documentation/#!using-xsl/embedding/...。特别是它说(在第1点下):“您可以使用XsltTransformer上的方法为全局样式表参数设置值”但请注意,手动执行此操作要容易得多,请从命令行参数调用XSLT转换,线。 –