2012-09-29 68 views
1
<xsl:template match="foobar"> 
    <xsl:if test="a[name = 'foo']"> 
     <xsl:apply-templates select="x/y[1]|x/y[2]" /> 
    </xsl:if> 
    <xsl:if test="a[name = 'bar']"> 
     <xsl:apply-templates select="x/y[3]|x/y[4]|x/y[5]" /> 
    </xsl:if> 
</xsl:template> 

我想通過位置路徑表達式 「X/Y [1] | X/Y [2]」 和X/Y [3] | X/Y [ 4] | x/y [5]作爲參數,因爲這個值可能會在將來發生變化,我不想編輯模板,只能編輯參數定義。我想使用上面的模板作爲傳遞位置路徑用謂詞爲模板參數

<xsl:template match="foobar"> 
    <xsl:if test="a[name = 'foo']"> 
     <xsl:apply-templates select="$param1" /> 
    </xsl:if> 
    <xsl:if test="a[name = 'bar']"> 
     <xsl:apply-templates select="$param2" /> 
    </xsl:if> 
</xsl:template> 

據我所知這是不可能的。外部化位置路徑表達式的最佳方式是什麼?

提前

+1

動態評估在XSLT 1.0和XSLT 2.0中均不可用。它可能在XSLT 3.0中可用(現在具有工作草案的狀態)。克服這種障礙的一種方法是進行轉換,根據其源XML文檔生成新的樣式表 - 然後執行新生成的轉換。 –

+1

非常感謝您的提示。新樣式表的生成是一個選項。 – Toru

回答

1
<xsl:template match="foobar"> 
    <xsl:param name="param1" /> 
    <xsl:param name="param2" /> 
    <xsl:if test="a[name = 'foo']"> 
     <xsl:apply-templates select="$param1" /> 
    </xsl:if> 
    <xsl:if test="a[name = 'bar']"> 
     <xsl:apply-templates select="$param2" /> 
    </xsl:if> 
</xsl:template> 

非常感謝,然後調用模板用:

<xsl:call-template name="foobar"> 
    <xsl:with-param name="param1" select="actualXPath1"/> 
    <xsl:with-param name="param2" select="actualXPath2"/> 
</xsl:call-template> 

,或者你可以在XSLT文件的開頭使用全局參數。

<xsl:param name="param1" select="actualXPath1"/> 
<xsl:param name="param2" select="actualXPath2"/> 
<!-- continue with template definitions --> 
... 

This article may help。

+0

模板參數的使用不是問題。但使用模板參數**與XPath表達式**相關。而你的例子不適用於XPath表達式。 – Toru

+0

你說得對。你不能只參數化「測試」屬性而不是「選擇」?它應該是可能的http://stackoverflow.com/questions/2250604/how-to-use-a-parameter-in-a-xslt-as-a-xpath –

0

如果你不介意使用專有的功能或EXSLT,可以動態評估可以作爲一個字符串XPath表達式:

然後,您可以將這些XPath字符串作爲全局參數傳遞給XSLT,或將它們存儲在外部文件中。