2011-08-22 50 views
4

在我的第二次xsl:模板匹配中,我該如何測試匹配模式?例如,如果匹配模式是標題,我想輸出不同的值?如何在xsl:apply-template中測試匹配?

<xsl:template match="secondary-content"> 
    <div class="secondary"> 
     <xsl:apply-templates select="title" /> 
     <xsl:apply-templates select="block/content | content" /> 
    </div> 
    </xsl:template> 
    <xsl:template match="title|content|block/content"> 
    <xsl:copy-of select="node()" /> 
    </xsl:template> 
+0

問得好,+1。請參閱我的答案,以獲得簡單,簡短並且不包含任何明確的邏輯XSLT指令的解決方案。 –

回答

3

好問題,+1。

在第二模板,使用這個測試表達式:

test="self::title" 

test="local-name() = 'title'" 

例如,可以使用

<xsl:choose> 
    <xsl:when test="self::title"> 
    <someThing>foo</someThing> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:copy-of select="node()" /> 
    </xsl:otherwise> 
</xsl:choose> 
+0

謝謝,這很好。 – steve

+0

@steve:很好。順便說一句,如果你滿意,你可以「接受」這個答案。 – LarsH

3

爲什麼它不分成兩個獨立的模板規則是什麼?當不同情況下的邏輯不同時,使用單個模板規則來處理多個案例似乎很奇怪。使用單獨的規則,如果邏輯很複雜,則將公共/共享邏輯歸入命名模板(或者如果您感覺雄心勃勃,則對通用邏輯使用xsl:next-match或xsl:apply-imports)。

2

幾乎總是最好不要在模板主體內有條件邏輯。

因此,代替

<xsl:template match="title|content|block/content"> 
    <xsl:choose> 
    <!-- conditional processing here --> 
    </xsl:choose> 
</xsl:template> 

寫入

<xsl:template match="title"> 
    <!-- Some processing here --> 
</xsl:template> 

<xsl:template match="content|block/content"> 
    <!-- Some other processing here --> 
</xsl:template> 

順便說一句,匹配content|block/content相當於短content

因此,最後一個模板可以進一步簡化爲

<xsl:template match="content"> 
    <!-- Some other processing here --> 
</xsl:template> 
+1

有效的點。但是,這將有助於瞭解爲什麼(因此*當*)使用匹配規則比使用'choose' /'if'更好。我假定OP已經將這些模板合併爲一個模板,例如,因爲大部分處理都是相同的,只有相對較小的條件部分。但也許情況並非如此。 – LarsH

相關問題