带有自定义结果文档处理程序的 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的自定义结果对象