首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在msxsl标记内引用外部文件中的C#代码

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

Stack Overflow用户
提问于 2012-06-29 19:53:21
回答 2查看 4.1K关注 0票数 4

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

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

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

使用硬编码函数的转换:

代码语言:javascript
复制
...

<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>

...

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

代码语言:javascript
复制
...

<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>

...

其中的源文件类似于:

代码语言:javascript
复制
<![CDATA[
  public string emphasise(string input) {
    return input+"!";
  }
]]>

这个是可能的吗?这些函数通常很复杂(与本例不同),并且不能用XSLT代码重现。是否读取外部文件中的namespaceusing关键字,或者是否必须将它们包含在<msxsl:using>标记之外?

我对<msxsl>标签的使用非常陌生,如果我误解了一些基本的东西,请让我知道!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-29 20:40:25

I.下面是如何做的

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

代码语言:javascript
复制
<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>

你的转换

代码语言:javascript
复制
<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:\temp\delete\c#script.xsl"/>

 <xsl:template match="/">
  <xsl:value-of select="cs:emphasise('Hello')"/>
 </xsl:template>
</xsl:stylesheet>

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

代码语言:javascript
复制
Hello!

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

我强烈建议而不是在所有的中使用内联脚本。一种更好、更有效、更安全的方法是将所有必需的扩展函数放在一个扩展对象中--请阅读有关类及其方法的内容。

票数 3
EN

Stack Overflow用户

发布于 2012-06-29 20:35:38

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11261294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档