2015-09-10 88 views
0

我想使用應用模板,並與模式應用模板就像在下面的例子解釋說:XSLT「應用模板」和「應用模板與模式」在單一的去

我輸入XML看起來像:

<catalog> 
<product dept="aaa"> 
    <number>111</number> 
    <name>cap</name> 
    <color>blue</color> 
</product> 
<product dept="bbb"> 
    <number>222</number> 
    <name>bat</name> 
    <color>white</color> 
</product> 
<product dept="ccc"> 
    <number>333</number> 
    <name>bag</name> 
    <color>red</color> 
</product> 

現在我用下面所示的XSLT與部門刪除產品元素= BBB,但它不工作努力。輸出中出現相同的輸入xml。我知道我可以通過刪除最後一個模板上的模式屬性來實現我想要的結果,但我試圖理解爲什麼它不能以我在這裏嘗試的方式工作。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" version="1.0" exclude-result-prefixes="exsl"> 
    <xsl:template match="/"> 
    <xsl:variable name="modXml"> 
     <xsl:apply-templates /> 
     <xsl:apply-templates mode="remove" /> 
    </xsl:variable> 
    <xsl:copy-of select="exsl:node-set($modXml)/*" /> 
    </xsl:template> 
    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*" /> 
     <xsl:apply-templates /> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="/catalog/product[@dept='bbb']" mode="remove" /> 
</xsl:stylesheet> 

有人能解釋一下XSLT處理器如何在這裏運行轉換..?

非常感謝..!

回答

0

這裏:

<xsl:variable name="modXml"> 
     <xsl:apply-templates /> 
     <xsl:apply-templates mode="remove" /> 
</xsl:variable> 

當你做的第一:

<xsl:apply-templates /> 

你所申請的身份文件轉換模板所有節點(遞歸)。一旦完成,變量已經包含整個文檔的副本。從這一點上你不會做任何事情會改變這一點。

然後,當你這樣做:

<xsl:apply-templates mode="remove" /> 

添加爲變量的現有結果樹片段。碰巧,應用的模板實際上並沒有添加任何內容 - 但它也不會從已經存在的結果中刪除任何內容。沒有辦法這樣做。

+0

那麼這是否意味着第一個xsl:apply-templates之後的任何後續xsl:apply-templates在變量聲明內都不會有任何效果?試試這個: 也給出了與我的初始代碼。按照你的說法,它應該在應用第一個xsl:apply-templates時刪除dept =「bbb」的產品標籤,然後忽略第二個xsl:apply-templates,.. ..? – Lokesh

+0

不。模板並不真正「移除」任何東西。這只是一個比喻。模板寫入(或不寫入)結果樹,獨立於任何其他模板。爲了實現「刪除」效果,您必須具有(至少)兩個模板:一個複製所有內容的通用模板,以及一個不復制特定節點的特定模板。當您將它們**一起應用**(並以相同的模式)時,則更具體的模板優先,並且通用模板**不會應用到特定節點。在你的情況下,有兩個階段:首先複製一切,然後不要複製一些東西。 –

+0

正如我在之前的評論中提到的那樣,您是否注意到我在第二次嘗試中顛倒了xsl:apply-templates的順序(即先寫入'mode',然後是通用寫入)。 – Lokesh