2012-02-28 77 views
2

這不是我的代碼。但它模擬到我想要的那就是爲什麼我在這裏使用它。我得到這個從herexslt應用模板和匹配

<xsl:template match="/"> 
<xsl:apply-templates select="event/details"> 
<xsl:with-param name="title" select="event/title"/> <!-- pass param "title" to matching templates --> 
</xsl:apply-templates> 
</xsl:template> 

<xsl:template match="details"> 
<xsl:param name="title"/> <!-- this template takes parameter "title" --> 
Title: <xsl:value-of select="$title"/><br/> 
Timestamp: <xsl:value-of select="java:DateUtil.getDate(number(timestamp))"/><br/> 
Description: <xsl:value-of select="description"/><br/> 
</xsl:template> 

我的問題是我能得到上述匹配模板「細節」與參數和一個不帶參數?對不起,我的英語..我知道如果我沒有意義,我會盡我所能來重寫這個。先進的謝謝你。

編輯:這是我想要的。

template 1 - with parameter: 

<xsl:template match="details"> 
<xsl:param name="title"/> <!-- this template takes parameter "title" --> 
Title: <xsl:value-of select="$title"/><br/> 
Timestamp: <xsl:value-of select="java:DateUtil.getDate(number(timestamp))"/><br/> 
Description: <xsl:value-of select="description"/><br/> 
</xsl:template> 

template 2 - without parameter: 

<xsl:template match="/"> 
<xsl:apply-templates select="event/details"/> 
</xsl:template> 

<xsl:template match="details"> 
Timestamp: <xsl:value-of select="java:DateUtil.getDate(number(timestamp))"/><br/> 
Description: <xsl:value-of select="description"/><br/> 
</xsl:template> 
+0

你的意思並不完全清楚。您應該編輯您的帖子以包含樣本輸入XML和期望的輸出。 – 2012-02-28 00:46:30

+0

我希望這會有道理..抱歉,我是xslt的新手。基本上我想在C#語言是帶參數和不帶參數的函數。所以我可以使用兩個,當我有參數,當我不.. – AJP 2012-02-28 00:52:49

+0

根據參數的數量和/或類型在XSLT沒有動態選擇相同的模板(重載)。 – 2012-02-28 01:02:27

回答

0

一,它是可恢復的錯誤有兩個模板使用相同的匹配模式 - 僅在其中的一個將被選擇執行最好的情況下。

在您的具體示例中,您可以僅使用具有參數的模板並略微修改其代碼,以便參數沒有值時(空字符串),則不寫入標題。

這裏是一個小的示範瞭如何可以做到這一點

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="event/details"/> 
     =========== 
     <xsl:apply-templates select="event/details"> 
      <xsl:with-param name="title" select="'Title Provided'"/> 
     </xsl:apply-templates> 

    </xsl:template> 

    <xsl:template match="details"> 
     <xsl:param name="title"/> 

    <xsl:value-of select= 
    "concat(substring('Title: ', 
         1 + 7*not(string-length($title) > 0) 
        ), 
      $title) 
    "/> 
     <br/> Timestamp: 
     <xsl:value-of select="'someTimeStamp'"/> 
     <br/> Description: 
     <xsl:value-of select="description"/> 
     <br/> 
    </xsl:template> 

</xsl:stylesheet> 

在這個轉變匹配details模板調用兩次 - 第一次不帶參數,並第二次用$title參數。在這兩種情況下,模板生成所需的輸出

<br/> Timestamp: 
     someTimeStamp<br/> Description: 
     <br/> 
     =========== 
     Title: Title Provided<br/> Timestamp: 
     someTimeStamp<br/> Description: 
     <br/> 

II。 xsl:function in XSLT 2.0

想要什麼可以通過xsl:function實現 - 用XSLT編寫的函數 - 此功能僅在XSLT 2.0(及更高版本)中可用。編寫同一函數的不同重載是完全可能的,我們有很多這樣的例子。

+0

謝謝你的回覆..但在我的情況下,我想修改其他進程正在使用的現有xslt文件。我試圖將參數添加到許多進程之一來輸出一點不同。我試圖避免修改其他進程。所以我想我將不得不重新寫這種方法以其他方式..因爲我不能重寫這個..再次感謝你。 – AJP 2012-02-28 01:00:20

+0

@AJP:如果模板屬於不同的*導入*樣式表,則可以重寫。請閱讀'xsl:import'。或者,如果你有XSLT 2.0處理器,只需使用'xsl:function',正如我的答案更新所解釋的那樣,它可以有不同的重載。 – 2012-02-28 01:12:43

+0

謝謝..我想我會寫新的模板,因爲我的要求是有點不同。但我確實從中得到了一些知識......真正明白你的時間和幫助。 – AJP 2012-02-28 01:15:56

0

您的兩個模板的區別主要在於「如果標題已經提供然後顯示」。爲了達到這個目的,你可以使參數默認爲一個空序列(在XSLT 2.0中,將select="()"添加到xsl:param中,或者在1.0,select="/.."中),然後將條件邏輯添加到形如「if $ title exists」的模板中顯示它「。