2016-09-26 37 views
1

我有一個XSLT文件導入,myxslt.xslt,包含進口,這看起來有點像這樣:加載XSLT與裝配在C#

<?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); 
      } 
     } 

,因爲我在這個答案看到:Adding (Embedded Resource) Schema To XmlReaderSettings Instead Of Filename?

流,並負載的XmlReader罰款。

但是,當我嘗試加載xslt時,我的應用程序拋出無法找到文件異常。它無法加載的文件是someOtherXsltFile.xslt

這兩個文件都是作爲嵌入資源加載的,並且這兩個文件都在assembly.GetManifestResourceNames的列表中可見。

我寧願不更改xslt文件中的任何內容,因爲這些文件是隨我嘗試轉換的消息一起提供的標準文件。

有沒有辦法使用程序集導入來加載我的xslt?

+0

[This question](http://stackoverflow.com/questions/995591/how-to-resolve-xsl-includes-in-a-transformation-that-loads-xsl-from-a-string)可能是相應 – stuartd

回答

1

感謝stuartd發佈的鏈接(How to resolve XSL includes in a Transformation that loads XSL from a String?),我設法找出瞭解決方案。

我進口現在看起來像這樣:

 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包括其所有進口。