使用 xsltc.exe XslCompiledTransforms 时如何解析具有相对路径的 元素?

2024-02-22

作为我们的 Web 应用程序构建过程的一部分,我设置了要使用的 XSLT 样式表来构建微软的xsltc.exe http://msdn.microsoft.com/en-us/library/bb399405.aspx每当我们运行完整编译时。在本地开发期间,这非常有效,因为代码是在同一位置编译和托管的。然而,一旦将其放在构建服务器上,问题就出现了。

构建服务器将像我在本地一样编译 XSLT 样式表,但随后运行一个脚本,将编译后的代码部署到我们的内部临时 Web 服务器。一旦这些二进制文件从编译位置移动,相对路径<xsl:import> and <xsl:include>元素不再正确解析,导致运行 XSLT 样式表时出现如下所示的异常。

Could not find a part of the path 'e:\{PATH}\xslt\docbook\VERSION'.
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize)
    at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn)
    at System.Xml.Xsl.Runtime.XmlQueryContext.GetDataSource(String uriRelative, String uriBase)

以下是目前代码的总体思路:

var xslt = new XslCompiledTransform();
xslt.Load(typeof(Namespace.XslTransforms.CompiledXsltStylesheet));
xslt.Transform("input.xml", "output.xml");

现在,我使用带有单个“Type”参数的 XslCompiledTransform.Load() 方法来引入基于 xsltc.exe 的预编译 XSLT 样式表。我可以从堆栈跟踪中看出,.NET 框架正在使用 XmlUrlResolver 来尝试解析这些外部样式表的实际位置,但我没有找到一种方法来提供 XmlResolver 的重写实现,我可以在其中传递新的baseUri 指向这些样式表在 Web 服务器上的位置。

我认为我可以通过不再使用 xsltc.exe 预编译并通过 XmlReaders 加载 XSLT 样式表来解决此问题,因为这将使我可以使用其他 XslCompiledTransform.Load() 方法 http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.load.aspx其中有一个参数,我可以在其中提供我自己的 XmlResolver 实现。但是,我喜欢用于语法验证和性能的预编译选项,因此除非绝对必要,否则我不想放弃它。

有没有办法使用 xsltc.exe 预编译这些 XSLT 样式表,但仍然提供一种方法来显式声明相对路径解析的 baseUri<xsl:include> and <xsl:import>运行时的元素?


After a lot玩这个,我发现我是对的,我提供的代码自动使用系统.Xml.XmlUrlResolver http://msdn.microsoft.com/en-us/library/system.xml.xmlurlresolver.aspx来解决<xsl:include> and <xsl:import>运行时的相对路径。但是,XmlUrlResolver 的使用并不局限于System.Xml.XslCompiledTransform http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx当它被放入二进制文件中时xsltc.exe http://msdn.microsoft.com/en-us/library/bb399405.aspx. XmlResolver 实际上是由Xml解析器 http://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.xmlresolver.aspx财产在System.Xml.XmlReaderSettings http://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.aspx on the 系统.Xml.XmlReader http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx在运行时执行转换。在我使用的 XsltReaderSettings 上设置自己的自定义 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() and GetEntity()方法,以便引用的文件位于<xsl:include> and <xsl:import>可以找到基于的相对路径。作为额外的好处,通过将相同的 XmlResolver 添加到Transform()方法,document()XML 中的操作也将正确解析其相对路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 xsltc.exe XslCompiledTransforms 时如何解析具有相对路径的 元素? 的相关文章

  • 运行 t4 脚本作为 resx 文件的自定义工具

    我有一个资源文件MyResource resx 我想改变MyResource Designer cs文件生成 我有一个 t4 脚本 它接受 resx 文件作为输入并给出结果转换 但是 我必须手动运行此 t4 才能使其工作 我看到 resx
  • 在调用堆栈中看到大量 clr!CLR Semaphore::Wait

    我们看到很多像下面这样的调用堆栈 我可以知道什么条件 情况会发生这种情况吗 OS Thread Id 0x48654 559 Current frame ntdll NtWaitForSingleObject 0xa Child SP Re
  • 在 DataGridView 中隐藏行非常慢

    我在 Winforms 应用程序中有一个 DataGridView 大约有 1000 行 未绑定 和 50 列 隐藏一列需要整整 2 秒 当我想隐藏大约一半的行时 这就成为一个问题 private void ShowRows string
  • 在不使用 ncurses 的情况下用 C/C++ 编写“真正的”交互式终端程序,例如 vim、htop...

    不 我不想使用ncurses 因为我想了解如何 终端可以工作 并且我自己编程也很有趣 没有 必须是可移植的 它必须只能在基于 linux xterm 的终端仿真器上工作 我想做的是编写一个交互式终端应用程序 例如 htop 和 vim 我的
  • 求一个数的因数。无法得到准确的结果

    有人可以帮助纠正我的算法吗 我已经对几个数字进行了测试 但它没有输出完整的因式分解 对于具有大量因子的数字 它完全失败 int num 20 for int i 2 i lt num i if num i 0 cout lt lt i lt
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • C++:初始化静态字符串成员

    我在 C 中初始化静态字符串成员时遇到一些问题 我有几个类 每个类都包含几个表示 id 的静态字符串成员 当我通过调用静态函数初始化变量时 一切都很好 但是 当我想为一个变量分配另一个变量的值时 它仍然保留空字符串 这段代码有什么问题 st
  • C for 循环索引:新 CPU 中的前向索引更快吗?

    在我订阅的邮件列表上 两位知识渊博的 IMO 程序员正在讨论一些优化的代码 并说了以下内容 在 5 8 年前发布的 CPU 上 向后迭代 for 循环稍微快一些 e g for int i x 1 i gt 0 i 因为比较i归零比将其与其
  • 函数参数评估顺序[重复]

    这个问题在这里已经有答案了 在 C 和 C 中 函数参数的求值是否有固定的顺序 我的意思是 标准怎么说 是吗left to right or right to left 我从书中得到的信息令人困惑 是否有必要function call应该使
  • printf() 使用字符串表“解码器环”调试库

    我写这封信是想看看你们中是否有人见过或听说过我即将描述的想法的实现 我有兴趣为嵌入式目标开发 printf 风格的调试库 目标非常遥远 并且我和目标之间的通信带宽预算非常紧张 因此我希望能够以非常有效的格式获取调试消息 通常 调试语句如下所
  • 数组与映射的性能

    我必须循环一个大数组中的元素子集 其中每个元素都指向另一个元素 问题来自于检测大图中的连接组件 我的算法如下 1 考虑第一个元素 2 将下一个元素视为前一个元素所指向的元素 3 循环直到没有发现新元素 4 考虑1 3中尚未考虑的下一个元素
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • 如何解决内存碎片

    我们偶尔会遇到这样的问题 长时间运行的服务器进程 在 Windows Server 2003 上运行 由于内存分配失败而引发异常 我们怀疑这些分配由于内存碎片而失败 因此 我们一直在寻找一些可能对我们有帮助的替代内存分配机制 我希望有人能告
  • 非静态类中的静态方法和静态类中的静态方法有什么区别?

    我有两个班级A级和B级 static class ClassA static string SomeMethod return I am a Static Method class ClassB static string SomeMeth
  • char* argv[] 在 c/c++ 中如何工作? [复制]

    这个问题在这里已经有答案了 我知道它用于使用命令行中的参数 但我没有得到声明 字符 argv 它是否意味着指向 char 数组的指针 如果是的话为什么没有大小 如果不是动态数组 就不需要有大小吗 我做了一些研究 发现有人说它会衰减为 cha
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • 为什么调试器只显示数组指针中的一个元素?

    首先 我知道new是执行此操作的 C 方法 我只是表明有不止一种方法可以重现此错误 而且两种方法都令人难以置信的令人沮丧 我有两种形式的源文件 我正在尝试调试另一个编程作业 但我并没有寻求帮助 基本上 我正在尝试重新实施set作为一个类 具
  • 如何在给定点停止线程?

    我试图停止一些线程 阅读一些有关优雅地执行此操作的正确方法的内容 但我一定做错了什么 因为它根本不起作用 起初我尝试不使用lock with IsRunning不稳定 然后尝试使用锁 这是我所拥有的 private volatile boo
  • 从 STL 列表中删除项目

    我想创建一个函数 如果符合特定条件 则将项目从一个 STL 列表移动到另一个列表 这段代码不是这样做的方法 迭代器很可能会被擦除 函数失效并导致问题 for std list
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所

随机推荐

  • 如何在迭代时向列表添加值[重复]

    这个问题在这里已经有答案了 我有一个这样的场景 List
  • Android-R.java 文件未找到

    在处理 android 项目时 我被 R java 文件困住了 即使我清理项目 项目 gt clean 也找不到该文件 但该文件仍然找不到 即使我创建一个相同的新项目出现问题 我需要做什么 我期待有价值的答复 以便我可以克服这个问题 R j
  • 不知道如何导出 Objective-C 类。 i386 体系结构的未定义符号

    我正在尝试在 OSX 上的 GTK 上做一些工作 但遇到了一些麻烦 因为说实话 我对 Objective C 不太熟悉 我有足够的编程经验 可以很快掌握基本语法 并且可以在文档中查找我需要的内容 但我遇到的问题与链接库并将类暴露给我链接的程
  • 使用 Linkify.addLinks 与 Html.fromHtml 结合使用

    我有一个TextView通过调用以下命令获取其数据集 tv setText Html fromHtml myText 字符串myText包含部分格式化的 html 数据 例如 它可能有字体标签 但没有任何使用格式设置的 url 链接 a h
  • 通过 MsBuildProj 文件转换多个项目的多个配置文件

    我正在尝试根据模式 所有形式的文件 在文件列表上运行多个命令 config在给定目录的子目录下 如下所示
  • Node.js docker 容器未更新以适应卷的变化

    我正在尝试在我的 Windows 计算机上托管一个开发环境 该计算机托管前端和后端容器 到目前为止 我只在后端工作 所有文件都位于 C 盘上 通过 Docker Desktop 共享 我有以下 docker compose 文件和 Dock
  • 通过 Response.ContentType、Response.End 输出文件时如何显示进度状态/旋转器?

    我有一个网络表单下载链接按钮 在按钮的点击事件上我正在获取数据 然后生成 XLSX 文件供下载 在文件生成过程中 响应 Clear 叫做 响应内容类型被设定并最终响应 End 叫做 我需要显示微调器 gif在那次操作期间 文件生成并弹出文件
  • 角度区域

    什么是区域 Angular ngZone 与 zone js 有何不同 什么时候应该使用它们 有人可以帮助提供使用 ngZone 的实际示例吗 我在这里浏览了角度文档 但是我无法完全理解 https angular io api core
  • Systemd http 健康检查

    我在 Redhat 7 1 上有一个服务 我使用 systemctl 启动 停止 重新启动和状态来控制 有一次 systemctl 状态返回 active 但服务 背后 的应用程序响应的 http 代码与 200 不同 我知道我可以使用 M
  • 每次插入数据库时​​如何找到数据字段(例如电子邮件)的唯一性?

    我正在开发一个 Android 应用程序 用户在其中输入姓名 电子邮件和密码进行注册 这个输入过程工作得很好 现在我想在每次用户输入他 她的电子邮件时检查输入的电子邮件是否已存在于我的数据库中 为此 我在 DBHelper 类中尝试了以下方
  • 4.1 android模拟器未检测到sd卡

    我曾经使用 4 1 kitkat x86 android 模拟器和 SD 卡进行测试 将 Android Studio 升级到 2 3 后 我无法再访问 android 中提供的 SD 卡 这使得我无法进行测试 谷歌还没有对此的答案 我也没
  • 等待所有 pid 在 php 中退出

    我的问题是这样的 我正在分叉一个进程 以便可以加快磁盘上文件的访问时间 我将这些文件中的所有数据存储在本地桌面上的 tmp 文件中 理想情况下 在所有进程完成后 我需要访问该 tmp 文件并将该数据放入数组中 然后我取消链接 tmp 文件
  • 自动化 sftp 上传过程

    我正在寻找一种将文件 目录结构从一台服务器上传到另一台服务器的方法 在我的情况下 唯一可能的方法是 SFTP 上传 有没有简单的方法来上传它 使用脚本或其他东西 而不需要对文件 目录进行存档 我想在远程服务器上重新创建 谢谢你 也许可以使用
  • 如何获取不带参数的文件名?

    我需要找到我包含的不带 GET 参数的文件的文件名 例如 如果当前 URL 是 我想要返回 file php 我发现了什么 basename SERVER REQUEST URI 返回 file php a b c d 就我而言 我在购物车
  • DataAnnotations:递归验证整个对象图

    我有一个对象图 上面散布着 DataAnnotation 属性 其中对象的某些属性是本身具有验证属性的类 等等 在以下场景中 public class Employee Required public string Name get set
  • 什么东西永远不等于自己?

    Prolog 中是否存在不等于其自身的价值 我写的answer https stackoverflow com a 53404595 10631003对某些人关于树的最小值的问题 https stackoverflow com q 5339
  • PHP如何检索数组值

    我有以下数组 我想检索name comment and each of the tags 插入数据库 我如何检索数组值 另外 我可以仅过滤大于 3 个字符且仅包含 a Z0 9 值的标签值吗 非常感谢 Array folder gt tes
  • Facebook Like 按钮以 0 宽度和 0 高度呈现?

    我是 facebook api 的新手 所以我不知道这是否是一个新手问题 我所做的是我遵循快速开始 https developers facebook com docs javascript quickstart v2 3 我将以下代码片段
  • Project Reactor:如何控制通量排放

    我有一个能发出一些光的通量Date This Date映射到我在某些设备上运行的 1024 个模拟 HTTP 请求Executer 我想做的是等待所有 1024 个 HTTP 请求 然后再发出下一个请求Date 目前运行时 onNext 被
  • 使用 xsltc.exe XslCompiledTransforms 时如何解析具有相对路径的 元素?

    作为我们的 Web 应用程序构建过程的一部分 我设置了要使用的 XSLT 样式表来构建微软的xsltc exe http msdn microsoft com en us library bb399405 aspx每当我们运行完整编译时 在