c# / xslt - XmlResolver 未被 document() 函数调用

Posted

技术标签:

【中文标题】c# / xslt - XmlResolver 未被 document() 函数调用【英文标题】:c# / xslt - XmlResolver not being called by document() function 【发布时间】:2016-10-30 03:32:00 【问题描述】:

假设我有以下场景:

XSL 文件“A”包括 XSL 文件“B”

XSL 文件“A”调用 document('file-C.xml')

上面的所有外部资源都嵌入到程序集中,并使用下面的函数解析,

public class EmbeddedResourceResolver : XmlResolver

    public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
    
        var assembly = Assembly.GetExecutingAssembly();
        return assembly.GetManifestResourceStream(Path.GetFileName(absoluteUri.AbsolutePath)");
    

结果是:

XSL 文件“B”已成功加载。 未找到 XML 文件“C”。

根据 MSDN https://msdn.microsoft.com/en-us/library/0e96wzcy(v=vs.71).aspx

如果 XSLT 样式表包含 标记, 或 document() 函数,然后使用 XmlResolver 实现 定位外部资源。

我调试了 GetEntity 函数,我看到它在加载 File-B 时被调用,但对于 File-C,这个函数没有被触发。

有什么想法吗?

/更新:这是我完成转换的实际代码

public string MapIcsrToR2(Batch batch)

    string xmlR2;
    using (var xsl = Assembly.GetExecutingAssembly().GetManifestResourceStream("Safety.E2B.Mappers.Conversion.downgrade-icsr.xsl"))
    using (var xmlR3 = new StringReader(MapIcsrToR3(batch)))
    
        using (var xslReader = XmlReader.Create(xsl))
        using (var xmlReader = XmlReader.Create(xmlR3))
        
            var xslSettings = new XsltSettings(true, false); // document function is allowed
            var xslResolver = new EmbeddedResourceResolver();
            var xslt = new XslCompiledTransform();

            xslt.Load(xslReader, xslSettings, xslResolver);

            using (var sw = new StringWriter())
            using (var xws = XmlWriter.Create(sw, new XmlWriterSettings 
                Encoding = Encoding.UTF8
            ))
            
                xslt.Transform(xmlReader, xws);
                xmlR2 = sw.ToString();
            
        
     
     return xmlR2;

【问题讨论】:

你真的使用XslTransform吗?如果您使用 XslcompiledTransform,请确保您的 XsltSettings 允许使用 document 函数。 是的,我正在使用 XslCompiledTransform 并且允许使用文档功能。我更新了问题。 我现在没有时间测试,但是Transform 方法msdn.microsoft.com/en-us/library/ms163443(v=vs.110).aspx 的额外重载采用XmlResolver,所以试试xslt.Transform(xmlReader, null, xws, xslResolver); 经过测试,现在问题已解决!。请把它作为答案,我会将其标记为正确的。非常感谢您的帮助。 我已将建议放入答案中。 【参考方案1】:

XslCompiledTransformTransform 方法重载采用带有 XmlResolver 的附加参数,用于 document 函数,在您的情况下,https://msdn.microsoft.com/en-us/library/ms163443(v=vs.110).aspx 允许您调用

xslt.Transform(xmlReader, null, xws, xslResolver);

【讨论】:

以上是关于c# / xslt - XmlResolver 未被 document() 函数调用的主要内容,如果未能解决你的问题,请参考以下文章

C#只查询xslt的父节点

如何在 C# 中应用 XSLT 样式表

从 C# 代码重命名 XSLT 属性值

如何为 XSLT 代码片段配置 CruiseControl 的 C# 版本?

在 C# asp.net 中加载 XSLT 时出错

C# 中的 XSLT 转换 - 如何获取包含文档的有效 URL?