2013-03-07 171 views
2

我在那裏我想了一些可能的路徑相匹配,以下列方式模板的情況:XSLT匹配模板

<xsl:template match="blah"> 
    <xsl:apply-templates select="foo/*/baz" mode="someMode"/> 
</xsl:template> 

<xsl:template match="*" mode="someMode"> 
    <xsl:if test="current() != 'foo/bar/baz' and 
       current() ! ='foo/bam/baz'"> 

    <!-- Process here --> 

    </xsl:if> 
</xsl:template> 

因此,大家可以看到,有可能是在任意數量的元素'foo'有'baz'元素(例如'bar','bam','bal','bav'等),但我只知道其中的2個,'bar'和'bam'。我不想處理這些,但我做的其他人。不幸的是,current()方法沒有返回匹配的路徑,所以測試總是成功的(即使當路徑是'foo/bar/baz'或者'foo/bam/baz'時

我怎麼能檢索在if-test中匹配的路徑?

請注意:我不能有其他特別匹配'foo/bar/baz'和'foo/bam/baz'的xsl:template元素,因爲它們在其他地方正在處理(在其他方面)。

回答

2

current函數不返回的路徑,它將返回當前上下文節點(即外[]斷言它是完全一樣的.的,斷言它的內該值爲.會在它之外)。

而不是使用<xsl:if>你應該定義無操作模板相同someMode匹配你做特定元素不想要的,那麼主*模板將僅針對那些你希望。

<xsl:template match="foo/bar/baz | foo/bam/baz" mode="someMode" /> 

<xsl:template match="*" mode="someMode"> 
    <!-- Process here --> 
</xsl:template> 

你說

請注意:我不能有其他的xsl:模板元素專門匹配「富/酒吧/巴茲」和「富/ BAM /巴茲」,因爲他們正在其他地方進行處理(以其他方式)。

但是這是模式的整點 - 現有的其他模式foo/bar/baz模板仍然會做同樣的,因爲他們習慣了。

+0

真棒!非常感謝,修正了它:)不知道你可以在多個模板上使用相同的模式 – starman1979 2013-03-07 19:20:56

+0

@mohisham如果你想到這一點,那就是你一直在做的事 - 通常的元素沒有一個'mode'都處於相同的模式(默認模式,沒有名字)。 – 2013-03-07 19:27:34

0

如果您有其他與foo/bar/baz和foo/bam/baz匹配的mode =「someMode」模板,那麼您在該模式下匹配*的模板將永遠不會觸發這些元素,並且您的測試即使你重新制定它來說出你想要的東西,有條件的東西永遠也是如此。

如果你不完全確定一個與foo/bar/baz或foo/bam/baz模式相匹配的給定元素在別處是否匹配,並且你想確保你的if聲明中的代碼贏得了'牛逼火,你可以重鑄測試作爲

test="not(self::baz/parent::bar/parent::foo 
      or self::baz/parent::bam/parent::foo)" 

許多XSLT程序員會不同的寫出來,雖然通過增加測試的謂詞爲模板匹配模式:

<xsl:template mode="someMode" 
       match="*[not(self::baz/parent::bar/parent::foo 
         or self::baz/parent::bam/parent::foo)]"> 
    <!-- process ... --> 
</xsl:template>