4

私は、それぞれが大きなXMLファイルで機能する多くの複雑なXSL変換で構成されるシステムを使用しています。独自のプログラムは、XMLファイルをデータベースに渡す前に、各XMLファイルでXSLTをコンパイルします。

XSL変換には、ほとんどの場合、<msxsl>タグ内のC#関数が含まれます。これらの関数の多くは、コードを手動でコピーして複数のファイル間で繰り返されます。<msxsl>関数の一般的なリポジトリが1つのファイルに格納され、タグによって読み取られる前に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コードで再現することはできません。外部ファイルのキーワードを読み取るのでしょうか、それとも外部ファイルの外にタグnamespaceを付けて含める必要があるのでしょうか。using<msxsl:using>

私は<msxsl>タグの使用にまったく慣れていません。基本的なことを誤解している場合は、お知らせください。

4

2 に答える 2

3

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:\temp\delete\c#script.xsl"/>

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

この変換が(任意のXMLドキュメントで)実行されると、必要な結果が生成されます。

Hello!

警告:このようなインラインスクリプトを使用すると、変換が何度も繰り返されるとメモリの断片化が発生し、メモリリークが発生する可能性があることが知られています。

インラインスクリプトはまったく使用しないことを強くお勧めします。より良い、より効率的で安全なアプローチは、拡張オブジェクトに必要なすべての拡張関数を含めることです。XsltArgumentListクラスとそのAddExtensionObject()メソッドについて読んでください。

于 2012-06-29T12:40:24.527 に答える
2

http://msdn.microsoft.com/en-us/library/ms256188.aspxを使用して、外部アセンブリのコードを参照できます。これにより、コードを外部の場所に移動する方法が提供される可能性があります。

于 2012-06-29T12:35:38.397 に答える