2016-06-28 22 views
0

のは、私は次のシナリオがあるとしましょう:C#/ XSLT - ドキュメント()関数によって呼び出されていないXmlResolverの

  • XSLファイル "" XSLファイル "B"

    < XSLが含まれていますが含まhref = "ファイルB.xsl"/>

  • XSLファイル "" 通話の文書( 'ファイルC.xml')

    <のxsl:変数名= "myFileC" =「文書( 『ファイルC.xml』)」/ >

  • 上記すべての外部リソースアセンブリに埋め込まれており、以下の機能を使用して解決され、

    public class EmbeddedResourceResolver : XmlResolver 
    { 
        public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) 
        { 
         var assembly = Assembly.GetExecutingAssembly(); 
         return assembly.GetManifestResourceStream(Path.GetFileName(absoluteUri.AbsolutePath)"); 
        } 
    } 
    

結果を選択次のとおりです。

  • XSLファイル "B"が正常に読み込まれました。
  • XMLファイル "C"が見つかりません。

XSLTスタイルシートが< XSL含まれている場合MSDN https://msdn.microsoft.com/en-us/library/0e96wzcy(v=vs.71).aspx

によれば:インポート>又は< XSLを:>タグ、 又はその後文書()関数、XmlResolverの実装を含みます を使用して外部リソースを特定します。

私はGetEntity関数をデバッグしましたが、これはFile-Bをロードするときに呼び出されますが、File-Cではこの関数はトリガーされていません。

アイデア?

/更新:これは、変換はあなたのケースでは、document機能に使用するXmlResolverで追加のパラメータを取るXslCompiledTransformTransformメソッドのオーバーロードがあります

public string MapIcsrToR2(Batch batch) 
{ 
    string xmlR2; 
    using (var xsl = Assembly.GetExecutingAssembly().GetManifestResourceStream("Safety.E2B.Mappers.Conversion.downgrade-icsr.xsl")) 
    using (var xmlR3 = new StringReader(MapIcsrToR3(batch))) 
    { 
     using (var xslReader = XmlReader.Create(xsl)) 
     using (var xmlReader = XmlReader.Create(xmlR3)) 
     { 
      var xslSettings = new XsltSettings(true, false); // document function is allowed 
      var xslResolver = new EmbeddedResourceResolver(); 
      var xslt = new XslCompiledTransform(); 

      xslt.Load(xslReader, xslSettings, xslResolver); 

      using (var sw = new StringWriter()) 
      using (var xws = XmlWriter.Create(sw, new XmlWriterSettings { 
       Encoding = Encoding.UTF8 
      })) 
      { 
       xslt.Transform(xmlReader, xws); 
       xmlR2 = sw.ToString(); 
      } 
     } 
    } 
    return xmlR2; 
} 
+0

本当に 'XslTransform'を使用していますか? XslcompiledTransformを使用する場合、 'XsltSettings'が' document'関数の使用を許可していることを確認してください。 –

+0

はい私はXslCompiledTransformを使用していますが、私はドキュメント関数の使用を許可しています。私は質問を更新しました。 – Javier

+1

今はテストする時間がありませんが、 'Transform'メソッドの追加オーバーロードがあります。https://msdn.microsoft.com/en-us/library/ms163443(v=vs.110).aspx 'XmlResolver'で' xslt.Transform(xmlReader、null、xws、xslResolver); 'を試してください。 –

答えて

関連する問題