【问题标题】:Saxon.Api.DynamicError, "Cannot find a matching 1-argument function named {exslt.org/common}node-set()"Saxon.Api.DynamicError,“找不到名为 {exslt.org/common}node-set() 的匹配 1 参数函数”
【发布时间】:2023-03-02 21:34:01
【问题描述】:

嗨专家/迈克尔凯

我得到“Saxon.Api.DynamicError - 找不到名为 {exslt.org/common}node-set() 的匹配 1-argument 函数。没有具有本地名称节点集的 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;
}

提前致谢

萨兰

【问题讨论】:

    标签: xml xslt xpath saxon


    【解决方案1】:

    作为一般规则,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>
    

    【讨论】:

    • 我试过 9.5 也发现了同样的问题,我喜欢按照建议使用自己来实现 XSLT。非常感谢您的大力帮助。
    • Michael Kay:我刚刚尝试了 9.6 HE,看来 function-available('exslt:node-set') 仍然返回 false。也许函数在那里,但 function-available() 不知道?
    • 是的,谢谢,我们已经注意到 function-available() 问题是这里的一个错误:saxonica.plan.io/issues/2212
    【解决方案2】:

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

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

    【讨论】:

    • 嗨迈克尔,非常感谢您的快速回复。我正在使用第 3 方 XSLT,因此我无法更改我的 XSLT,在哪里/如何获取/购买 Saxson-EE.dll?
    • @saravanans,Saxon 的商业版可以从saxonica.com/download/download_page.xml#current 下载,但您需要在他们的在线商店购买许可证才能运行它们。但是,如果您只想使用exsl:node-set,那么我首先会考虑重写样式表以删除对该函数的任何调用,因为这在 XSLT 2.0 中是不必要的,并且在 Saxon PE/EE 中除了返回它之外基本上什么都不做论据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多