在 msxsl 标记中的外部文件中引用 C# 代码



我正在使用一个由许多复杂的XSL转换组成的系统,每个转换都处理大型XML文件。专有程序在每个 XML 文件上编译 XSLT,然后再将 XML 文件传递到我们的数据库。

XSL 转换几乎总是涉及 <msxsl> 标记中的 C# 函数,其中许多函数在手动复制代码的多个文件之间重复。我正在尝试实现一个系统,其中函数的常规存储库存储在一个文件中,然后在被<msxsl>标记读取之前加载到 XSLT 文件中。

我的问题是我一直无法找到一种方法来从外部文件加载<msxsl>中的代码。下面是我的意思的一个例子:

使用硬编码函数的转换:

...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:msxsl="urn:schemas-microsoft-com:xslt"
            xmlns:cs="urn:my-scripts-csharp">
...
<msxsl:script language="C#" implements-prefix="cs">
  <![CDATA[
    public string emphasise(string input) {
      return input+"!";
    }
  ]]>
</msxsl:script>
...

虽然我希望函数在外部加载:

...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:msxsl="urn:schemas-microsoft-com:xslt"
            xmlns:cs="urn:my-scripts-csharp">
...
<msxsl:script language="C#" implements-prefix="cs">
  <--- file loaded here --->
</msxsl:script>
...

其中源文件如下所示:

<![CDATA[
  public string emphasise(string input) {
    return input+"!";
  }
]]>

这可能吗?这些函数通常很复杂(与此示例不同),无法使用 XSLT 代码重现。是读取外部文件中namespaceusing关键字,还是必须使用<msxsl:using>标签将它们包含在外部

我对<msxsl>标签的使用很陌生,如果我误解了一些基本的东西,请告诉我!

I.这是操作方法

文件: C:\temp\delete\c#script.xsl

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 xmlns:cs="urn:my-scripts-csharp">  
    <msxsl:script language="C#" implements-prefix="cs">
    <![CDATA[
     public string emphasise(string input)
     {
      return input+"!";
      }
      ]]></msxsl:script>
</xsl:stylesheet>

您的转型

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 xmlns:cs="urn:my-scripts-csharp">
 <xsl:include href="C:tempdeletec#script.xsl"/>
 <xsl:template match="/">
  <xsl:value-of select="cs:emphasise('Hello')"/>
 </xsl:template>
</xsl:stylesheet>

执行此转换(在任何 XML 文档上)时,将生成所需的结果:

Hello!

警告:如果多次重复转换,使用此类内联脚本会导致内存碎片,这可能会导致内存泄漏。

我强烈建议不要使用内联脚本。一个更好、更有效和安全的方法是在扩展对象中包含所有必要的扩展函数 -- 阅读有关 XsltArgumentList 类及其AddExtensionObject()方法的信息。

您可以使用以下方法在外部程序集中引用代码: http://msdn.microsoft.com/en-us/library/ms256188.aspx - 可以提供将代码移动到外部位置的方法

相关内容

  • 没有找到相关文章

最新更新