2

XSLT を使用して着信 XML メッセージを変換するアプリケーションを作成しています。複数の 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\General\A.xslt' の一部が見つかりませんでした。

私の XSLT B では、このステートメントを使用して A.xslt を含めています。

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

埋め込まれた xslt を C# の別の xslt に含めるための適切な回避策を誰かが提案できますか?

4

1 に答える 1

1

xsl:include で絶対パスを使用するか、次のようにカスタム 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 の load 関数で使用し、

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

文字列から XSL をロードする変換で XSL インクルードを解決する方法は?

于 2013-02-22T07:45:35.633 に答える