将嵌入式XSLT包含到另一个嵌入式XSLT中

时间:2013-02-22 07:21:39

标签: c# xslt

我正在创建一个使用XSLT转换传入XML消息的应用程序。我有多个XSLT,其中一些包含其他XSLT。

e.g。 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中吗?

1 个答案:

答案 0 :(得分: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的加载函数中使用它,

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

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