【问题标题】:Saxon XSLT passing ParametersSaxon XSLT 传递参数
【发布时间】:2011-12-10 09:52:08
【问题描述】:

我在使用 Saxon 9.3 设置参数时遇到问题。我有我的基本转换功能

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[] name 和 String[] val 是具有参数名称和对应值的等长数组。示例:name[0] 为“版本”,val[0] 为“1.0”,name[1] 为“文件名”,val[1] 为“test.xml”

我将此函数基于文档中给出的示例代码,并且它可以正确地用于我的各种 xslt 转换,除非我有参数要传递给 xslt。转换将发生,就好像没有设置参数一样。

通过调试,我知道程序确实为我的 name 数组中的每个值运行 SetParameter。我的每个 xslt 文档中都定义了 xsl:param,当使用命令行工具 Transform.exe 时,输入参数并得到正确的转换。

我尝试传递参数的方式有问题吗?

【问题讨论】:

    标签: c# parameters xslt saxon


    【解决方案1】:

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

    我建议跟进 saxon-help 列表(其中消息被正确跟踪 - 当你在这里询问时,我们是否碰巧看到消息是纯粹的机会),提供所有需要的信息 - 一个完整的 C#程序和一个简单的样式表。

    【讨论】:

    • 感谢您的回复和缩小尺寸的建议帮助我测试了我的功能。我专门创建了一个单独的程序来运行这个函数,并发现它确实有效,这意味着我在向函数输入参数的方式中一定存在一些模糊的一致错误。如果我有其他问题,我会跟进 saxon-help。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    相关资源
    最近更新 更多