簡體   English   中英

在 C# 中使用從程序集導入加載 Xslt

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM