Saxon.Api.DynamicError,"找不到名为{exslt.org/common}node-set()"的匹配单参数函数;

时间:2014-10-29 03:59:14

标签: xml xslt xpath saxon

嗨专家/ Michael Kay

我得到了“Saxon.Api.DynamicError - 找不到名为{exslt.org/common} node-set()的匹配的1参数函数。没有使用本地名称node-set的Saxon扩展函数”通过使用saxon9he - v9.4.0.2。我的XSLT文件正在调用“EXSLT”。请帮我解决这个问题。

public static StringWriter XSLT2(string sourceFile, string XSLT)
{
    Processor processor = new Processor();

    var setting = new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse };
    XmlReader reader2 = XmlReader.Create(sourceFile, setting);
    XdmNode input = processor.NewDocumentBuilder().Build(reader2);
    //XPathCompiler compiler = processor.NewXPathCompiler();
    //compiler.DeclareNamespace("exsl", "http://exslt.org/common");

    // Create a transformer for the stylesheet.
    //Stream XsltTransformer transformer = processor.NewXsltCompiler().Compile(XSLT).Load();
    XsltTransformer transformer = processor.NewXsltCompiler().Compile(new Uri(XSLT + @"\mekontopic.xsl")).Load();
    transformer.InputXmlResolver = new XmlUrlResolver();

    // Set the root node of the source document to be the initial context node
    transformer.InitialContextNode = input;

    // Create a serializer
    StringWriter s = new StringWriter();
    Serializer serializer = new Serializer();//serializer.SetOutputWriter(Console.Out);
    serializer.SetOutputWriter(s);

    // Transform the source XML to System.out.
    transformer.Run(serializer);
    return s;
}

提前致谢

SARAN

2 个答案:

答案 0 :(得分:2)

作为一般规则,Saxon-HE不提供任何扩展功能;你必须升级到Saxon-PE。

然而,exslt:node-set()扩展在XSLT 1.0代码中被广泛使用,我们在这个代码中得到了解决,它在Saxon-HE 9.6中可用,并且(我认为,还需要检查)在9.5。

如果您需要,还有另一种解决方法:自己实施。只需将自定义模块添加到包含代码的样式表(导入以前是主模块的主模块)

<xsl:function name="exslt:node-set" as="node()">
  <xsl:param name="n" as="node()"/>
  <xsl:sequence select="$n"/>
</xsl:function>

答案 1 :(得分:0)

根据http://www.saxonica.com/feature-matrix.html,HE版本不支持EXSLT功能。您需要升级到更高版本,或者(最好)重写样式表以利用XSLT 2.0,它不需要EXSLT扩展功能。

或许您可以降级到XSLT 1.0处理器,例如Saxon 6.5或Xalan。