问题 将参数传递给XSLT样式表


我正在尝试将一些参数传递给XSLT样式表。我跟着这个例子: 通过.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"/>

我错过了什么吗?


7617
2017-10-08 19:04


起源

你有 <xsl:param name="processingId"> 在顶层?似乎您在模板中定义参数,该模板将创建本地参数。对于外部参数,参数必须是全局的,因此必须在与xsl:template元素相同的级别定义 - Pawel
我不确定你在顶级的意思。我粘贴在我的问题中,参数定义低于<xsl:template match =“/”>。上面是<xsl:stylesheet>标记。 - coson
我的意思是它不应该在xsl:template里面。尝试这样的事情: <xsl:stylesheet ...> <xsl:param name="processingId" /><xsl:template match="/"><xsl:value-of select="$processingId"/>... - Pawel


答案:


这是我的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>

15
2017-10-09 12:19



这实际上是一个非常方便的事情,任何人都知道这是否也可以使用Java完成? - adam5990
@ adam5990,是的,如果使用的特定XSLT处理器是用Java编写的。以编程方式指定全局参数值的方法是特定于实现的,并且从XSLT处理器到XSLT处理器各不相同。例如,参见Saxon文档的这一部分:saxonica.com/documentation/#!using-xsl/embedding / ...特别是它(在第1点下):“你可以使用XsltTransformer上的方法设置全局样式表参数的值”但请注意,手动执行此操作要容易得多,从命令调用XSLT转换 - 线。 - Dimitre Novatchev