2011-07-11 34 views
3

我如何過早退出模板?如何過早退出模板?

就像我想:

<xsl:template match="asd"> 
    <xsl:if test="$true">EXIT TEMPLATE()</xsl:if> 
    <!--my main code here--> 
</xsl:template> 

我做這種方式現在(這是工作,當然),但無可爭議上面的代碼是非常巧妙的,如果有,工程它的一個變種:

<xsl:template match="asd"> 
      <xsl:choose> 
       <xsl:when test="$true"></xsl:when> 
       <xsl:otherwise> 
        <!--my main code here--> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:template> 

回答

3

有幾種方法可以做到這一點。如果條件不包含可變/參數參考(其未在匹配模式允許在XSLT 1.0),則簡單地將其移動成匹配模式,如下所示:

<xsl:template match="asd[not(<some_boolean_expression>)]"> 
    <!--my main code here--> 
</xsl:template> 

如果$true是可變/參數引用,然後有條件地應用模板:

<xsl:template match="parent_of_asd"> 
    <xsl:apply-templates select="asd[not($true)]"/> 
</xsl:template> 

<xsl:template match="asd"> 
    <!--my main code here--> 
</xsl:template> 
2

你不能完全按照你的描述來做; XSLT是一種聲明性語言,而不是程序性語言,它並不是真的以「程序流程」爲設計思路。然而,套用你的榜樣,你可以這樣做:

<xsl:template match="asd[not($true)]"> 
    <!--my main code here--> 
</xsl:template> 

向下的一面的情況是,它可以防止你進入擺在首位的模板,所以你不能有前「如果」什麼。

注意:嚴格地說,XSLT1.0的規範不應該允許像這樣的匹配條件的變量,但許多XSLT 1.0引擎無論如何都會這樣做,而且這只是一個問題,如果你實際上是條件有這樣一個變量。然而,XSLT 2.0確實正式允許它。

+0

這有可能被稱爲XSLT 2.0解決方案。 –

+0

不,它不。我不得不承認,我認爲'$ true'是一種更有意義的表示,但是你可以在樣式表的根目錄中定義一個變量或參數,並在XSLT1.0中像這樣使用它。 – Flynn1179

+0

不,你不能。 XSLT 1.0不支持模板匹配模式中的變量引用。如果您假設$ true不是一個變量,那麼必須提及這一點。 –

2

如果:

  • 沒有使用XSLT 2.0(@弗林的答案)
  • 你不想擺脫你的變量引用,或使用apply-templates辦法(@ Iwburk的答案)

,您仍然可以使用xsl:if和帶負邏輯方式工作:

<xsl:if test="not($true)"> 
<!--your main code here--> 
</xsl:if>