2010-08-22 18 views
6

我有兩個XSL文件: 「one.xsl」 和 「two.xsl」如何使用函數從一個XSL在另一個

one.xsl:

<xsl:function name="x:trans" as="xs:string"> 
    <xsl:param name="str"></xsl:param> 
    <xsl:variable name="res1" select="x:translate_string($str)"/> 
    <xsl:sequence select="$res1"/> 
</xsl:function> 
</xsl:stylesheet> 

我想用「one.xsl」中的函數「x:trans」

如何將函數引用到另一個文件?


的問題是,當我嘗試這樣調用這個函數:

< xsl:value-of select="x:trans('Hello World')"/> 

我從瀏覽器中出現以下錯誤信息:

引用了未聲明的命名空間前綴:「X 「

+0

如果您已導入或包含「one.xsl」,那麼如果要使用它,還需要在「two.xsl」中聲明「x」命名空間。 – 2010-08-22 12:19:38

+3

另外,您提到來自* browser * ...自定義**函數的消息是XSLT 2.0功能**。目前沒有瀏覽器支持XSLT 2.0。如果你想讓瀏覽器執行你的XSLT,你需要一個* XSLT 1.0 *解決方案。 – 2010-08-22 12:24:15

+0

好問題(+1)。查看我的答案,獲取如何調用'xsl:function'的詳細說明。 – 2010-08-22 14:34:52

回答

1

在two.xsl:

<xsl:include href="one.xsl" /> 

另請參閱XSLT 2.0 spec中的包含說明。

4

您想要做<xsl:include /><xsl:import /><xsl:include />更簡單(它只是拖拽所有內容),而<xsl:import />更靈活(如果兩個模板之間發生衝突,調用的被調用的覆蓋被更好地定義並且通常是合理的)。

編輯爲補充信息:

你需要確保你使用調用了恰當的命名空間中導入的樣式表的模板。最簡單的方法是確保在樣式表中有匹配的xmlns:foo聲明,儘管您可以將一個樣式表中的foo:template作爲bar:另一個樣式表中的template,但如果它具有xmlns:bar,則可以調用。

+0

+1我通常更喜歡import over include,因爲它提供了更多的靈活性。 – 2010-08-22 12:14:17

+0

+1和喜歡xsl的同上:進口 – 2010-08-22 14:13:32

+0

是!一路導入 – 2010-08-23 02:12:39

7

除此之外,你需要<xsl:include><xsl:import>正確的回覆(我推薦後者,因爲前者往往造成重複錯誤),你的其他問題如下

  1. 函數名稱必須屬於名稱空間

  2. 命名空間必須在定義該函數的同一個文件中聲明爲(定義並綁定到前綴)。

  3. 任何調用該函數具有的前綴函數的名稱和該前綴必須綁定到相同的命名空間到該函數名所屬

下面是一個簡單的例子:

I.文件deleteA.xsl定義函數my:double

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="my:my" 
    > 
<xsl:function name="my:double" as="xs:double"> 
    <xsl:param name="pArg" as="xs:double"/> 

    <xsl:sequence select="2*$pArg"/> 
</xsl:function> 
</xsl:stylesheet> 

II。文件deleteB.xsl進口文件deleteA.xsl和使用功能my:double

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="my:my"> 
    <xsl:import href="deleteA.xsl"/> 

    <xsl:output method="text"/> 

    <xsl:template match="/"> 
     <xsl:sequence select="my:double(.)"/> 
    </xsl:template> 
</xsl:stylesheet> 

III。中包含的deleteB.xsl變換上下面的XML文檔施加:

<t>1</t> 

和正確的結果產生

2 

附加評論:目前沒有瀏覽器支持XSLT 2.0轉換 - xsl:function僅在XSLT 2.0 +中可用。

相關問題