2016-09-26 40 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包括其所有进口。