带有自定义结果文档处理程序的 Saxon 序列化程序选项

Posted

技术标签:

【中文标题】带有自定义结果文档处理程序的 Saxon 序列化程序选项【英文标题】:Saxon serializer options with custom result document handler 【发布时间】:2017-07-22 02:14:00 【问题描述】:

您好,我实现了一个自定义结果文档处理程序来解析相关 uri 并跟踪写入的文件。

private class ResultDocumentHandler : IResultDocumentHandler

    private List<string> writtenFiles = new List<string>();

    public List<string> WrittenFiles => this.writtenFiles;

    public XmlDestination HandleResultDocument(string href, Uri baseUri)
    
        if (href.Contains("%"))
            href = Uri.UnescapeDataString(href);

        try
        
            Uri hrefUri = new Uri(href, true);

            if (hrefUri.IsAbsoluteUri)
            
                Directory.CreateDirectory(Path.GetDirectoryName(hrefUri.LocalPath));

                Serializer serializer = new Serializer();

                serializer.SetOutputFile(hrefUri.LocalPath);
                writtenFiles.Add(hrefUri.LocalPath);

                return serializer;
            
        
        catch
        
            // ignore
        

        try
        
            Uri absoluteUri = new Uri(baseUri, href, true);

            Directory.CreateDirectory(Path.GetDirectoryName(absoluteUri.LocalPath));

            Serializer serializer = new Serializer();

            serializer.SetOutputFile(absoluteUri.LocalPath);
            writtenFiles.Add(absoluteUri.LocalPath);

            return serializer;
        
        catch
        
            // ignore
        

        return new NullDestination();
    

到目前为止一切顺利。但是当我创建一个新的序列化程序时,它不会使用 xsl 文件中给出的选项。例如我用这个:

<xsl:result-document href="$resultDoc" method="html" omit-xml-declaration="yes" indent="no">

这些选项现在被忽略,因为我没有为序列化程序设置它们。但是如何在结果文档处理程序中访问它们?我想我可以使用Saxon.Api.XsltTransformer.GetOutputProperties() 访问xsl:output 的选项,但我需要特定xsl:result-document 的选项。

有什么办法吗?

【问题讨论】:

【参考方案1】:

我认为没有任何简单的方法可以实现这一目标。我已经在

https://saxonica.plan.io/issues/3153

您可以做的是忽略 Saxon.Api 包中的 ResultDocumentHandler 机制,并下拉到 Java 定义的 OutputURIResolver。您可以编写一个实现 OutputURIResolver 接口并返回 StreamResult 的 C# 类,并将其设置在支持 XsltTransformer 的 Controller 接口上。这很麻烦,因为您必须将 saxon9 DLL 和一些 IKVM DLL 添加到您的项目中,以便您可以针对 IKVM 提供的底层 Java API 的 C# 转换进行编程。我想这就是我们添加 ResultDocumentHandler 接口的原因,但是我们对用例考虑得不够仔细。

【讨论】:

谢谢迈克尔。也许我稍后会尝试你的建议。很高兴知道现在已对此进行跟踪,并将在将来修复。我很期待。

以上是关于带有自定义结果文档处理程序的 Saxon 序列化程序选项的主要内容,如果未能解决你的问题,请参考以下文章

为 Jackson 自定义反序列化程序抛出带有 HTTP 状态代码的自定义异常

Codeigniter查询结果返回带有setter的自定义结果对象

如何使用自定义 JMS 序列化程序处理程序设置 Nelmio Doc

10.异常处理自定义异常断言

使用 Saxon-JS 识别 XSLT 转换的性能瓶颈

C# 将 Saxon XSLT 转换结果显示到当前 ASP.NET 容器页面