2012-05-17 104 views
0

一個人怎麼導入樣式表,將實際參數值 給被叫樣式表?這裏是一個例子。導入XSLT樣式表與應用的樣式表參數

比方說,我有一個通用的樣式表,它需要一個參數「x」。 看起來像這樣,位於「general.xslt」。

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 
<xsl:param name="x" as="xs:string" /> 
... style-sheet content ... 
</xsl:stylesheet> 

我有一個更高級別的樣式表(specific.xslt),它希望通過導入來結合general.xslt的功能。這個更高級別的樣式表(specific.xslt)帶有一個參數「y」。更高級別的樣式表需要導入 general.xslt將y的一些函數 應用於形參x。如果這是合法的XSLT 2.0語法,它會讀一些,這樣的事:

更高級別樣式表:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 
<xsl:param name="y" as="xs:string" /> 
<xsl:import href="general.xslt"> 
    <xsl:with-param name="x" select="some-function($y)" /> 
</xsl:import> 

<xsl:function name="some-function" as="xs:string"> 
    <xsl:param name="value" as="xs:string" /> 
    ... content goes here ... 
</xsl:function> 

... more content ... 

</xsl:stylesheet> 

當然上面的是不合法的語法,但它說明了什麼我想實現 - 以類似的方式調用具有實際參數的樣式表,以調用具有參數的模板。這在任何版本的XSLT中都可能嗎?

插圖Michael Kay的答案

general.xslt: 這種低層次的樣式表需要一個參數。形式參數是x。

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    version="2.0" 
    exclude-result-prefixes="xsl xs fn"> 
<xsl:param name="x" as="xs:string" /> 
<xsl:template match="/"> 
    <root> 
    The value of x is <xsl:value-of select="$x" /> 
    </root> 
</xsl:template> 
</xsl:stylesheet> 

specific.xslt: 這種高級樣式表需要的參數。形式參數是y。撒克遜

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="http://my.com" 
    version="2.0" 
    exclude-result-prefixes="xsl xs fn my"> 
<xsl:import href="general.xslt" /> 
<xsl:param name="y" as="xs:string" /> 

<xsl:function name="my:some-function" as="xs:string"> 
    <xsl:param name="value" as="xs:string" /> 
    <xsl:value-of select="concat($value, '!') " /> 
</xsl:function> 
<xsl:variable name="x" select="my:some-function($y)" /> 

<xsl:template match="/"> 
    <xsl:apply-imports/> 
</xsl:template> 
</xsl:stylesheet> 

命令行調用:

Transform.exe -s:specific.xslt -xsl:specific.xslt -o:specific-out.xml y=abc 

輸出:

<?xml version="1.0" encoding="UTF-8"?><root>The value of x is abc!</root> 

general.xslt的實際參數是 '!ABC'有一個xsl PARAM:

+1

對不起,但儘管我試圖理解這裏提到的問題,但我一直很努力。樣式表不被稱爲 - 這是令人困惑的。你究竟想要達到什麼?請問,編輯這個問題讓它更有意義? –

+0

是的你是對的,樣式表被導入或包含,不叫。問題相應更新。在編譯的某個點,導入的樣式表的形式參數需要綁定到某些特定的實際值。問題的關鍵是如何在調用樣式表中綁定該值。 Michael的回答是你在調用樣式表中定義了一個名稱相同的參數或變量。我對此感到驚訝。從程序背景來看,我期待着一個類似的參數綁定機制,如果調用一個命名模板或函數,您將使用它。 –

+1

是的,這裏我們有導入優先規則。導入樣式表模塊中的任何全局變量在任何導入(直接或間接)樣式表中都可見,並覆蓋任何這些樣式表模塊中的任何同名變量。這是因爲'xsl:import'語句總是必須在任何其他全局級語句之前出現。所以aglobal'xsl:variable總是出現在任何'xsl:import'之後並具有更高的優先級。 –

回答

1

您可以覆蓋XSL PARAM或XSL:變量(出現在頂層,即XSL的:stylesheet的子進口模塊)。

<xsl:variable name="x" select="some-function($y)" /> 
+0

謝謝。我買了你的書btw。我會推薦給任何人。關於它的最好的部分是騎士之旅 - 這真是令人愉快。 –