Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何解决<;xsl:import>;及<;xsl:include>;使用xsltc.exe XslCompiledTransforms时是否使用具有相对路径的元素?_C#_Xslt_Xslcompiledtransform - Fatal编程技术网

C# 我如何解决<;xsl:import>;及<;xsl:include>;使用xsltc.exe XslCompiledTransforms时是否使用具有相对路径的元素?

C# 我如何解决<;xsl:import>;及<;xsl:include>;使用xsltc.exe XslCompiledTransforms时是否使用具有相对路径的元素?,c#,xslt,xslcompiledtransform,C#,Xslt,Xslcompiledtransform,作为web应用程序构建过程的一部分,我将XSLT样式表设置为在运行完整编译时使用编译器构建。在本地开发期间,这非常有效,因为代码是在同一位置编译和托管的。但是,一旦将其放到构建服务器上,就会出现问题 构建服务器将编译XSLT样式表,就像我在本地所做的那样,但随后会运行一个脚本,将编译后的代码部署到我们的内部暂存web服务器。一旦这些二进制文件从编译位置移动,和元素中的相对路径将不再正确解析,从而导致在运行XSLT样式表时出现如下异常 找不到路径“e:\{path}\xslt\docbook\VE

作为web应用程序构建过程的一部分,我将XSLT样式表设置为在运行完整编译时使用编译器构建。在本地开发期间,这非常有效,因为代码是在同一位置编译和托管的。但是,一旦将其放到构建服务器上,就会出现问题

构建服务器将编译XSLT样式表,就像我在本地所做的那样,但随后会运行一个脚本,将编译后的代码部署到我们的内部暂存web服务器。一旦这些二进制文件从编译位置移动,
元素中的相对路径将不再正确解析,从而导致在运行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
    指令需要许多样式表
  • 使用加载主样式表,为导入/incldue指定解析器
  • 至少在运行时,您仍然可以从“编译”样式表中获益

    是否有方法使用xsltc.exe预编译这些XSLT样式表, 但是仍然提供了一种方法来显式地声明相对的baseUri 运行时
    元素的路径分辨率

    尝试使用

    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编译主样式表,它们也必须位于或中