C# 我如何解决<;xsl:import>;及<;xsl:include>;使用xsltc.exe XslCompiledTransforms时是否使用具有相对路径的元素?
作为web应用程序构建过程的一部分,我将XSLT样式表设置为在运行完整编译时使用编译器构建。在本地开发期间,这非常有效,因为代码是在同一位置编译和托管的。但是,一旦将其放到构建服务器上,就会出现问题 构建服务器将编译XSLT样式表,就像我在本地所做的那样,但随后会运行一个脚本,将编译后的代码部署到我们的内部暂存web服务器。一旦这些二进制文件从编译位置移动,C# 我如何解决<;xsl:import>;及<;xsl:include>;使用xsltc.exe XslCompiledTransforms时是否使用具有相对路径的元素?,c#,xslt,xslcompiledtransform,C#,Xslt,Xslcompiledtransform,作为web应用程序构建过程的一部分,我将XSLT样式表设置为在运行完整编译时使用编译器构建。在本地开发期间,这非常有效,因为代码是在同一位置编译和托管的。但是,一旦将其放到构建服务器上,就会出现问题 构建服务器将编译XSLT样式表,就像我在本地所做的那样,但随后会运行一个脚本,将编译后的代码部署到我们的内部暂存web服务器。一旦这些二进制文件从编译位置移动,和元素中的相对路径将不再正确解析,从而导致在运行XSLT样式表时出现如下异常 找不到路径“e:\{path}\xslt\docbook\VE
和
元素中的相对路径将不再正确解析,从而导致在运行XSLT样式表时出现如下异常
找不到路径“e:\{path}\xslt\docbook\VERSION”的一部分。
在System.IO.\uuu Error.WinIOError(Int32 errorCode,字符串maybeFullPath)
在System.IO.FileStream.Init(字符串路径、文件模式、文件访问权限、Int32权限、布尔用户权限、文件共享、Int32缓冲大小、文件选项选项、安全属性secAttrs、字符串msgPath、布尔bFromProxy、布尔useLongPath)
位于System.IO.FileStream..ctor(字符串路径、文件模式、文件访问权限、文件共享、Int32 bufferSize、文件选项选项、字符串msgPath、布尔bFromProxy)
位于System.IO.FileStream..ctor(字符串路径、文件模式、文件访问权限、文件共享共享、Int32 bufferSize)
位于System.Xml.XmlUrlResolver.GetEntity(Uri绝对Uri、字符串角色、对象类型返回)
位于System.Xml.Xsl.Runtime.XmlQueryContext.GetDataSource(字符串uriRelative,字符串uriBase)
以下是目前代码的总体思路:
var xslt=新的XslCompiledTransform();
Load(typeof(Namespace.XslTransforms.compiledxsltstStyleSheet));
Transform(“input.xml”、“output.xml”);
现在,我使用xslcomiledtransform.Load()方法和一个“Type”参数来引入基于xsltc.exe的预编译XSLT样式表。我可以从堆栈跟踪中看出,.NET framework正在使用XmlUrlResolver来尝试解析这些外部样式表的实际位置,但我看不到一种方法来提供XmlResolver的重写实现,在这种实现中,我可以传入一个新的baseUri,该URI指向这些样式表在web服务器上的位置
我假设我可以通过不再使用xsltc.exe预编译并通过XmlReaders加载XSLT样式表来解决这个问题,因为这将允许我使用具有参数的,我可以在其中提供自己的XmlResolver实现。但是,我喜欢用于语法验证和性能的预编译选项,因此我不想放弃它,除非我必须这样做
有没有一种方法可以使用xsltc.exe预编译这些XSLT样式表,但仍然可以提供一种方法来显式地声明运行时
和
元素的相对路径解析的baseUri?我不知道这是否破坏了您的系统,但是如何代替
xsltc.exe编译
import/include
指令需要许多样式表
和
元素的路径分辨率
尝试使用:
XmlResolver stylesheetResolver
此静态方法接受的参数之一是:
XmlResolver stylesheetResolver
在反复研究之后,我发现我提供的代码在运行时自动使用解析
和
相对路径是正确的。但是,当XmlUrlResolver被放置在二进制文件中时,它的使用并不绑定到XmlResolver实际上是由在运行时执行转换的上的属性选择的。一旦我在使用的XSLTrederSettings上设置了自己的自定义XmlResolver,我就能够控制相对路径分辨率
如果您想像我一样重写这个XmlResolver,可以使用以下代码作为指导:
var customXmlResolver = new SomeCustomXmlResolver(); // Derives from XmlResolver
var xmlReaderSettings = new XmlReaderSettings {
XmlResolver = customXmlResolver
};
var xslt = new XslCompiledTransform();
xslt.Load(typeof(Namespace.XslTransforms.CompiledXsltStylesheet));
using (var xmlReader = XmlReader.Create("input.xml", xmlReaderSettings)) {
using (var xmlWriter = XmlWriter.Create("output.xml")) {
xslt.Transform(xmlReader, null, xmlWriter, customXmlResolver);
}
}
我仍然在使用
xsltc.exe
编译XSLT样式表,但是当我在web服务器上加载这些编译后的样式表时,注入的SomeCustomXmlResolver
重写了被重写的ResolveUri()
和GetEntity()中的路径
方法,以便可以找到位于基于
和
的相对路径中的引用文件。作为额外的好处,通过在Transform()
方法的末尾添加相同的XmlResolver,document()
XML中的操作也将正确解析其相对路径。导入/包含的样式表是否未与二进制文件一起部署(部署到“内部暂存web服务器”),但是它们与编译它们的目录不同。如果在构建服务器(编译样式表的地方)上模拟暂存web服务器的目录结构,这会产生积极的影响吗?强制文件系统采用XSLT的特定格式是一个非常苛刻的要求,我不能要求。我宁愿吃演出中的热门节目。但是,这可能适用于在SOA环境中创建XSLT web服务的其他人,我完全可以直接从web服务器上的文件系统访问这些XSLT样式表。即使使用xsltc.exe编译主样式表,它们也必须位于或中