2011-10-18 58 views
1

我在使用Saxon 9.3设置参数时遇到问题。我有基本的变换函数撒克逊XSLT传递参数

private void runXSLT(String inFile, String xslt, String outFile, String[] name, String[] val) 
{ 
    Processor proc = new Processor(); 
    XdmNode input = proc.NewDocumentBuilder().Build(new Uri(inFile)); 
    XsltTransformer transformer = proc.NewXsltCompiler().Compile(new Uri(xslt)).Load(); 
    transformer.InitialContextNode = input; 
    if (name != null) 
     for (int i = 0; i < name.Length; i++) 
     transformer.SetParameter(new QName("", "", name[i]), new XdmAtomicValue(val[i])); 
    Serializer serializer = new Serializer(); 
    FileStream outStream = new FileStream(outFile, FileMode.Create, FileAccess.Write); 
    serializer.SetOutputStream(outStream); 
    transformer.Run(serializer); 
    outStream.Close(); 
} 

其中字符串[]名称和String [] VAL具有相等的长度与参数名称和相应的值的阵列。例如:name [0]是“version”,val [0]是“1.0”,name [1]是“filename”,val [1]是“test.xml”

我基于这个函数关闭样本代码在文档中给出,并且它对我的各种xslt转换正确运行,除非我有参数传递给xslt。转换将发生,如果参数未设置。

从调试中,我知道程序确实为我的名字数组中的每个值运行SetParameter。我在每个xslt文档中都有一个xsl:param,当使用命令行工具Transform.exe时,输入参数并获得正确的转换。

我想如何传递参数有什么问题吗?

回答

2

如果它从命令行工作,我看不到任何明显的原因,为什么它不应该与此代码工作。一个区别是,命令行将params作为untypedAtomic传递,而您将它们作为字符串传递 - 如果版本需要数字,这可能会有所不同。

我建议在撒克逊帮助列表中进行跟踪(在这里您可以正确地跟踪消息 - 当我们问这里时,是否看到消息是纯粹的机会),并提供一个可重现的小样本,提供所有需要的信息 - 满C#程序和一个简单的样式表。

+0

感谢您的回复,并建议更小的帮助我测试我的功能。我创建了一个专门用于运行此功能的单独程序,并找出它的工作原理,这意味着在向函数输入参数时必须存在一些模糊的一致性错误。如果我有其他问题,我会跟进撒克逊人的帮助。 –