2012-06-29 27 views
3

我使用的系統由許多複雜的XSL轉換組成,每個轉換對大型XML文件都有效。在將XML文件傳遞到我們的數據庫之前,專有程序將編譯每個XML文件上的XSLT。引用msxsl標記中的外部文件中的C#代碼

的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>標籤,如果我誤解的東西基本那麼就請讓我知道!

回答

2

一,這是如何做到這一點的一種方式:

文件:C:\ TEMP \刪除\ 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! 

警告:使用內嵌腳本像這些是已知的導致內存碎片,如果轉換重複多次,這可能導致內存泄漏。

我強烈建議使用而不是在所有處都使用內聯腳本。更好,更有效和安全的方法是在擴展對象中具有所有必需的擴展功能 - 閱讀關於類的方法及其AddExtensionObject()方法。

+0

非常感謝。我研究過'XsltArgumentList',但暫時我無法訪問讀取變換的源代碼。 –

+0

@Overlord_Dave:不客氣。 –

相關問題