【发布时间】: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);。 -
经过测试,现在问题已解决!。请把它作为答案,我会将其标记为正确的。非常感谢您的帮助。
-
我已将建议放入答案中。