一個人怎麼導入樣式表,將實際參數值 給被叫樣式表?這裏是一個例子。導入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:
對不起,但儘管我試圖理解這裏提到的問題,但我一直很努力。樣式表不被稱爲 - 這是令人困惑的。你究竟想要達到什麼?請問,編輯這個問題讓它更有意義? –
是的你是對的,樣式表被導入或包含,不叫。問題相應更新。在編譯的某個點,導入的樣式表的形式參數需要綁定到某些特定的實際值。問題的關鍵是如何在調用樣式表中綁定該值。 Michael的回答是你在調用樣式表中定義了一個名稱相同的參數或變量。我對此感到驚訝。從程序背景來看,我期待着一個類似的參數綁定機制,如果調用一個命名模板或函數,您將使用它。 –
是的,這裏我們有導入優先規則。導入樣式表模塊中的任何全局變量在任何導入(直接或間接)樣式表中都可見,並覆蓋任何這些樣式表模塊中的任何同名變量。這是因爲'xsl:import'語句總是必須在任何其他全局級語句之前出現。所以aglobal'xsl:variable總是出現在任何'xsl:import'之後並具有更高的優先級。 –