2016-09-26 2 views
1

ich eine xslt-Datei haben, myxslt.xslt, das enthält einen Import, die ein bisschen wie folgt aussieht:Last Xslt mit dem Import von der Montage in 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> 

Ich versuche, diese Dateien in mein C# zu importieren Anwendung durch die Montage mit:

Assembly assembly = Assembly.GetExecutingAssembly(); 

     using (Stream xsltStream = assembly.GetManifestResourceStream(mynamespace.myxslt.xslt)) 
     { 
      using (XmlReader xsltReader = XmlReader.Create(xsltStream)) 
      { 
       xslt.Load(xsltReader); 
      } 
     } 

, wie ich in dieser Antwort sah: Adding (Embedded Resource) Schema To XmlReaderSettings Instead Of Filename?

The Stream und XmlReader Last in Ordnung.

Allerdings löst meine Anwendung eine Datei nicht finden Ausnahme aus, wenn ich versuche, die Xslt zu laden. Die Datei, die nicht geladen werden kann, ist someOtherXsltFile.xslt.

Beide Dateien werden als eingebettete Ressource geladen und beide sind in der Liste von assembly.GetManifestResourceNames sichtbar.

Ich würde lieber nichts in den xslt-Dateien ändern, da dies Standarddateien sind, die mit den Nachrichten geliefert wurden, die ich zu transformieren versuche.

Gibt es eine Möglichkeit, meine XSLT mit einem Import von der Baugruppe zu laden?

+0

[Diese Frage] (http://stackoverflow.com/questions/995591/how-to-resolve-xsl-includes-in-a-transformation-that-loads-xsl-from-a-string) möglicherweise sein relevant – stuartd

Antwort

1

Dank dem Link von Stuartd (How to resolve XSL includes in a Transformation that loads XSL from a String?) Ich habe es geschafft, die Lösung herauszufinden.

Mein Import sieht nun wie folgt aus:

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

Und die MyXmlUrlResolver ist wie folgt definiert:

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

Dies lädt die Xslt alle seine Importe einschließlich.