| using System; | 
 | using System.Collections.Generic; | 
 | using System.Linq; | 
 | using System.Text; | 
 |  | 
 | namespace OfficeOpenXml.Utils | 
 | { | 
 |     internal class UriHelper | 
 |     { | 
 |         internal static Uri ResolvePartUri(Uri sourceUri, Uri targetUri) | 
 |         { | 
 |            if(targetUri.OriginalString.StartsWith("/")) | 
 |             { | 
 |                 return targetUri; | 
 |             } | 
 |             string[] source = sourceUri.OriginalString.Split('/'); | 
 |             string[] target = targetUri.OriginalString.Split('/'); | 
 |  | 
 |             int t = target.Length - 1; | 
 |             int s; | 
 |             if(sourceUri.OriginalString.EndsWith("/")) //is the source a directory? | 
 |             { | 
 |                 s = source.Length-1; | 
 |             } | 
 |             else | 
 |             { | 
 |                 s=source.Length-2; | 
 |             } | 
 |  | 
 |             string file = target[t--]; | 
 |  | 
 |             while (t >= 0) | 
 |             { | 
 |                 if (target[t] == ".") | 
 |                 { | 
 |                     break; | 
 |                 } | 
 |                 else if (target[t] == "..") | 
 |                 { | 
 |                     s--; | 
 |                     t--; | 
 |                 } | 
 |                 else | 
 |                 { | 
 |                     file = target[t--] + "/" + file; | 
 |                 } | 
 |             } | 
 |             if (s >= 0) | 
 |             { | 
 |                 for(int i=s;i>=0;i--) | 
 |                 { | 
 |                     file = source[i] + "/" + file; | 
 |                 } | 
 |             } | 
 |             return new Uri(file,UriKind.RelativeOrAbsolute); | 
 |         } | 
 |  | 
 |         internal static Uri GetRelativeUri(Uri WorksheetUri, Uri uri) | 
 |         { | 
 |             string[] source = WorksheetUri.OriginalString.Split('/'); | 
 |             string[] target = uri.OriginalString.Split('/'); | 
 |  | 
 |             int slen; | 
 |             if (WorksheetUri.OriginalString.EndsWith("/")) | 
 |             { | 
 |                 slen = source.Length; | 
 |             } | 
 |             else | 
 |             { | 
 |                 slen = source.Length-1; | 
 |             } | 
 |             int i = 0; | 
 |             while (i < slen && i < target.Length && source[i] == target[i]) | 
 |             { | 
 |                 i++; | 
 |             } | 
 |  | 
 |             string dirUp=""; | 
 |             for (int s = i; s < slen; s++) | 
 |             { | 
 |                 dirUp += "../"; | 
 |             } | 
 |             string file = ""; | 
 |             for (int t = i; t < target.Length; t++) | 
 |             {                 | 
 |                 file += (file==""?"":"/") + target[t]; | 
 |             } | 
 |             return new Uri(dirUp+file,UriKind.Relative); | 
 |         } | 
 |     } | 
 | } |