のは、私は次のシナリオがあるとしましょう: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
で追加のパラメータを取るXslCompiledTransform
のTransform
メソッドのオーバーロードがあります
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;
}
本当に 'XslTransform'を使用していますか? XslcompiledTransformを使用する場合、 'XsltSettings'が' document'関数の使用を許可していることを確認してください。 –
はい私はXslCompiledTransformを使用していますが、私はドキュメント関数の使用を許可しています。私は質問を更新しました。 – Javier
今はテストする時間がありませんが、 'Transform'メソッドの追加オーバーロードがあります。https://msdn.microsoft.com/en-us/library/ms163443(v=vs.110).aspx 'XmlResolver'で' xslt.Transform(xmlReader、null、xws、xslResolver); 'を試してください。 –