[英]Load Xslt with import from assembly in C#
我有一個 xslt 文件 myxslt.xslt,其中包含一個導入,看起來有點像這樣:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="someOtherXsltFile.xslt"/>
<!--Do some transformations -->
</xsl:stylesheet>
我正在嘗試使用程序集將這些文件導入到我的 C# 應用程序中:
Assembly assembly = Assembly.GetExecutingAssembly();
using (Stream xsltStream = assembly.GetManifestResourceStream(mynamespace.myxslt.xslt))
{
using (XmlReader xsltReader = XmlReader.Create(xsltStream))
{
xslt.Load(xsltReader);
}
}
正如我在這個答案中看到的: 將(嵌入式資源)架構添加到 XmlReaderSettings 而不是文件名?
Stream 和 XmlReader 加載正常。
但是,當我嘗試加載 xslt 時,我的應用程序拋出了找不到文件異常。 它無法加載的文件是someOtherXsltFile.xslt
。
這兩個文件都作為嵌入式資源加載,並且都在assembly.GetManifestResourceNames
的列表中可見。
我寧願不更改 xslt 文件中的任何內容,因為這些是我嘗試轉換的消息隨附的標准文件。
有沒有辦法使用從程序集中導入來加載我的 xslt?
感謝 stuartd 發布的鏈接( 如何解析 XSL 包含在從字符串加載 XSL 的轉換中? )我設法找出了解決方案。
我的導入現在看起來像這樣:
Assembly assembly = Assembly.GetExecutingAssembly();
using (Stream xsltStream = assembly.GetManifestResourceStream(mynamespace.myxslt.xslt))
{
using (XmlReader xsltReader = XmlReader.Create(xsltStream))
{
var resolver = new MyXmlUrlResolver();
xslt.Load(xsltReader,null,resolver);
}
}
MyXmlUrlResolver
定義如下:
private class MyXmlUrlResolver : XmlUrlResolver
{
private const string basePad = "MyNamespace.mysubnamespace.";
public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
{
switch (absoluteUri.Scheme)
{
case "file":
{
string origString = absoluteUri.OriginalString;
Assembly assembly = Assembly.GetExecutingAssembly();
// the filename starts after the last \
int index = origString.LastIndexOf('\\');
string filename = origString.Substring(index + 1);
string resourceName = basePad + filename;
var stream = assembly.GetManifestResourceStream(resourceName);
return stream;
}
default:
{
return (Stream)base.GetEntity(absoluteUri, role, ofObjectToReturn);
}
}
}
}
這將加載 xslt,包括其所有導入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.