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

时间:2017-03-02 11:17:51

标签: .net xslt saxon

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

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">

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

有没有办法这样做?

1 个答案:

答案 0 :(得分:0)

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

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

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