2013-02-22 95 views
2

我正在創建一個應用程序,它使用XSLT轉換傳入的XML消息。我有多個XSLT,其中一些包含其他XSLT。將嵌入式XSLT包含到另一個嵌入式XSLT中

例如B.XSLT包含A.XSLT,它包含一些常用功能。

我已將所有XSLT標記爲嵌入式資源,因此它將嵌入到可執行文件中。現在,當我使用下面的代碼加載很XSLT,

using (Stream objXSLTStream = Assembly.GetAssembly(this.GetType()).GetManifestResourceStream("MyNamespace.XSLContainer.Transaction.B.xslt")) 
{ 
    using (XmlReader objXSLTReader = XmlReader.Create(objXSLTStream)) 
    { 
     XslCompiledTransform objXSL = new XslCompiledTransform(true); 
     objXSL.Load(objXSLTReader); 
     XmlReader objXMLReader = XmlReader.Create(new StringReader(InputXML)); 
     StringBuilder sbOutputXML = new StringBuilder(); 
     XmlDocument docOutputXML = new XmlDocument(); 
     XmlWriter objXMLWriter = XmlWriter.Create(new StringWriter(sbOutputXML)); 
     objXSL.Transform(objXMLReader, ArgsList, objXMLWriter); 
     docOutputXML.LoadXml(sbOutputXML.ToString()); 

     return docOutputXML; 
    } 
} 

它給了我錯誤

找不到路徑 '.. \ Bin_Folder_Location \一般\ A.xslt' 的一部分。

在我的XSLT B,我包括A.xslt使用此語句

<xsl:include href ="../General/A.xslt"/> 

有人建議我適當的解決方法,包括嵌入式XSLT到在C#中的另一個XSLT?

回答

1

您需要可以使用絕對路徑在你的xsl:包括或作爲這裏使用自定義XmlUrlResolver:

class MyXmlUrlResolver : XmlUrlResolver 
    { 
     public override Uri ResolveUri(Uri baseUri, string relativeUri) 
     { 
      if (baseUri != null) 
       return base.ResolveUri(baseUri, relativeUri); 
      else 
       return base.ResolveUri(new Uri("http://mypath/"), relativeUri); 
     } 
    } 

而且在XslCompiledTransform的裝載功能使用它,

resolver=new MyXmlUrlResolver(); 
xslt.Load(xR,null,resolver); 

How to resolve XSL includes in a Transformation that loads XSL from a String?