2008-12-06 34 views

回答

37

發生這種情況,因爲XSLT中內置模板的 。 XSLT有 夫婦的內置模板, 說:

    當你申請模板元素
  • ,處理其子元素
  • 當你申請模板文本節點,賦予其價值

總之,這意味着如果你申請 模板元素,但沒有 該元素一個明確的模板,然後 其內容被處理並最終 你最終與文本 該元素包含。

閱讀完整的解釋:http://www.dpawson.co.uk/xsl/sect2/defaultrule.html

您可以通過定義自己的模板替換爲文本節點的默認模板,並將它什麼也不做。

<xsl:template match="text()" /> 
+1

如果XSLT 2.0,並使用模板模式,它​​可能是有幫助的使用`的`。否則,默認文本模板仍然適用,例如,如果您執行``。 – Svish 2013-01-29 10:04:45

2

,你可以設定一個模式,僅適用於自己的模板:

<xsl:template match="* | /" > 
    <xsl:apply-templates mode="myMode" /> 
</xsl:template> 

<xsl:template match="somenode" mode="myMode"> 
    <!-- do something here --> 
</xsl:template> 

另一種選擇是覆蓋內置的模板規則(例如見http://unix.com.ua/orelly/xml/xmlnut/ch08_07.htm

24

這可能是經驗豐富的XSLT程序員遇到的最常見的問題。

觀察到的行爲正是XSLT兼容處理器應該如何運行的。

要考慮到:

        <xsl:apply-templates/>

是一個縮寫:

        <xsl:apply-templates select="child::node()"/>

內置的存在模板規則。按照XSLT 1.0 Spec

5.8內置模板規則

有一個內置的模板規則允許遞歸處理由一個明確的模板規則在沒有成功的模式匹配的繼續在樣式表中,這個模板規則適用於元素節點和根節點。下面顯示了內置模板規則的當量:

 
<xsl:template match="*|/"> 
    <xsl:apply-templates/> 
</xsl:template> 

還有一個內置的對於每個模式,它允許遞歸處理繼續在同一模式在沒有成功的圖案的模板規則在樣式表中通過明確的模板規則進行匹配。此模板規則適用於元素節點和根節點。以下顯示的是模式m的內置模板規則的等效值。

 
<xsl:template match="*|/" mode="m"> 
    <xsl:apply-templates mode="m"/> 
</xsl:template>

還爲文本內置模板規則和屬性節點那份文本通過:

 
<xsl:template match="text()|@*"> 
    <xsl:value-of select="."/> 
</xsl:template> 

內置的處理指令的模板規則和意見是什麼也不做。

 
<xsl:template match="processing-instruction()|comment()"/> 

命名空間節點的內置模板規則也是什麼也不做。沒有可以匹配命名空間節點的模式;因此,內置的模板規則是應用於命名空間節點的唯一模板規則。

內置的模板規則,好像他們是在之前的樣式表隱式地導入等具有較低的導入優先比其他所有的模板規則進行處理。 因此,筆者可以通過包括一個明確的模板規則 「

--- XSLT規格的報價最終覆蓋內置的模板規則 ---

所以,如果作者想成爲在XSLT處理的完全控制權,他們應該覆蓋所有內置模板

例如,如果我們不希望text()節點被複制到輸出做,我們可以使他們通過覆蓋內置忽視在模板中按以下方式:

        <xsl:template match="text()" />