我正在创建一个使用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中吗?
答案 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?