2009-12-31 137 views
2

我對XSLT apply-template語句感到困惑。例如,在w3school中。XSLT模板匹配問題

http://www.w3schools.com/xsl/xsl_apply_templates.asp

要提到的 - 「的<xsl:apply-templates>元素應用模板到當前元素或當前元素的子節點。」,我的問題是,它是否適用於當前元素或子節點或都? 「或」這個詞讓我對它的明確行爲感到困惑。

編輯1:這裏是代碼片段我很困惑,我很困惑,當xslt處理器發現<xsl:apply-templates/>時,它會匹配「當前節點」的所有子節點。這裏「當前節點」是指目錄還是其他虛擬抽象XML根節點?爲什麼?

<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My CD Collection</h2> 
    <xsl:apply-templates/> 
    </body> 
    </html> 
</xsl:template> 

由於事先 喬治

回答

2

w3schools文檔並不是全部被破解的,我同意,在這種情況下這是相當具有誤導性的。

細則中指出:

在沒有選擇屬性,在xsl:應用模板指令處理所有當前節點的子節點,包括文本節點。

XML中的「兒童」總是指直接的孩子。兒童的孩子等被稱爲「後代」。

「當前節點」就是這個意思。這取決於apply-templates指令出現的上下文。

所以最初你可能有:

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

這裏當前節點是文檔節點,應用模板將作用於孩子們一道,即XML的頂級元素。

在此示例:

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

當前節點將是一個節點在什麼地方被稱爲「CD」的XML和應用模板會作用的,直接的兒童。

注意這方面的需求並不適用於元素稱爲「CD」,也沒有在實際上需要將其應用到任何元素稱爲「CD」,這將取決於如何其他模板在XSLT處理輸入XML。它所說的是,只要該模板匹配,當前節點將是一個「cd」節點。

+0

感謝您的幫助,我已更新我的帖子中EDIT1部分的更多疑惑,還有哪些意見? – George2 2010-01-01 05:25:13

+1

在你的例子中,當前節點是文檔節點。它既不虛擬也不抽象。它是DOM的最頂層節點和目錄元素的父節點。所以apply-templates指令將只選擇一個且唯一的「目錄」元素。 – Alohci 2010-01-01 11:22:37

+0

謝謝,問題回答! – George2 2010-01-01 16:01:58

1

<xsl:apply-templates/>當前節點的所有子節點相匹配。

在例如

<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My CD Collection</h2> 
    <xsl:apply-templates/> 
    </body> 
    </html> 
</xsl:template> 

當前節點(/)是目錄(根節點)。因此將應用匹配所有子節點(cd,標題,藝術家,國家,...)(如果它們存在)的模板。

您理解的最佳方法是更改​​示例中的xslt並觀察您獲得的各種輸出。

一種方法是刪除所有其他3個模板(cd,藝術家&標題)並再次運行xslt。

+0

感謝您的幫助,我已經更新了我的帖子的EDIT1部分,還有其他意見嗎? – George2 2010-01-01 05:28:03

2

在你想要的模板應用到當前元素,用例:

<xsl:apply-templates select="."/> 
+0

感謝您的幫助,我更新了我的帖子中EDIT1部分的更多疑惑,還有哪些意見? – George2 2010-01-01 05:25:49

1

我的問題是它是否適用於 當前元素或子節點 或兩者兼而有之?

這取決於apply-templates元素中是否存在選擇屬性。

如果它只是<xsl:apply-templates/>那麼匹配當前元素的子節點的模板將被應用。在w3Schools的情況下,這意味着cd,標題和藝術家都得到應用。

但是,如果您要執行類似<xsl:apply-templates select="/catalog/cd/artist"/>的操作,則只有該元素才能將模板應用於該模板。

+0

感謝您的幫助,我更新了我的帖子中EDIT1部分的更多疑惑,還有哪些意見? – George2 2010-01-01 05:27:31