【问题标题】:Can I go for in-line specification of the XSL into the XML document?我可以将 XSL 内嵌规范到 XML 文档中吗?
【发布时间】:2009-11-18 14:46:01
【问题描述】:

我在我们的 CRM 系统中嵌入了一个 HTML 控件,并使用它来显示一些 XML。我想使用 XSL 文档对其进行格式化。

当我使用 test.xml 和 test.xsl 在本地测试它时一切正常,但当然当我将 XSL 链接更改为

\\servername\share\test.xsl

然后它不起作用,我想是因为该位置不受信任。

我可以将 XSL 内嵌到 XML 文档中吗?当我不能真正使用相对路径时,我还能如何格式化浏览器控件的内容?

谢谢

【问题讨论】:

  • 忘了提到 XML 是由 .Net 应用程序使用 XMLDocument 等生成的
  • \servername\share?您是否尝试过将 XSL 与 XML 一起放在 Web 服务器上?这应该有效。
  • 好吧,XML 被生成并存储在 DB 字段中,并且只是显示在表单上的浏览器控件中 - 它实际上并不存在于“真实”的任何地方。现在,我已经使用了应用程序自己的每个用户文件夹并将 XSL 文件和生成的 XML 复制到其中,这样它对浏览器来说都是“本地的”。希望有一个不需要临时文件的浏览器内解决方案:(

标签: xml xslt


【解决方案1】:

我经常使用的一种技术是将 XSLT 作为清单资源编译到我的 .NET 程序集中。如果您的 XSLT 文件位于 Visual Studio 中,则可以在文件属性中将“构建操作”设置为“嵌入式资源”。然后资源的名称成为项目的默认命名空间,后跟文件的名称(我认为....通常我编译程序集,然后通过在清单中使用 ILDASM 来检查名称)。

无论如何 - 一旦您知道名称,您就可以使用这样的函数进行转换(注意,这是在我的实用程序程序集中,因此 GetCallingAssembly.... 在不同的设计中您可能会使用 GetExecutingAssembly):

public static XslCompiledTransform GetTransformByResourceName(string resourceName)
{
  XslCompiledTransform transform = new XslCompiledTransform(false);
  using (Stream manifestResourceStream = 
            Assembly.GetCallingAssembly().GetManifestResourceStream(resourceName))
  using (XmlTextReader reader = new XmlTextReader(manifestResourceStream))
  {
    XsltSettings settings = new XsltSettings(false, false);
    transform.Load(reader, settings, new XmlUrlResolver());
  }
  return transform;
}

当然,在某些方面,您会失去一些灵活性/可配置性,但至少您知道您的代码将能够找到 XSLT。

我对您的设计了解不多,不知道将转换移动到服务器是否会有所帮助。即使您必须在客户端进行转换,如果您已经从 .NET 应用程序提供 XML,那么提供 XSLT 也可能会起作用,但在这种情况下,无需单独将其部署到文件系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2011-02-17
    相关资源
    最近更新 更多