您好我实现了一个自定义结果文档处理程序来解析相对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
的选项。
有没有办法这样做?
答案 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接口,但我们没有仔细考虑用例。