2011-10-06 152 views
2

我想編寫一個匹配除一個元素之外的其他名稱空間的所有元素的XSLT模板。例如,我想匹配所有元素foo:*,但不匹配foo:barXSLT:匹配名稱空間中除一個元素以外的所有元素

可以在選擇器中定義這個,或者我必須在xsl:template(以及如何測試元素的本地名稱)中編寫xsl:if條件嗎?

+1

XSLT比賽埃爾(和其他節點),而不是標籤。一個元素通常有兩個標籤,一個開始標籤和一個結束標籤。它可以幫助每個人溝通,如果你試圖讓術語正確。 –

回答

5

要做到這一點,你可以有一個相匹配FOO模板:什麼也不做它像這樣吧

<xsl:template match="foo:bar" /> 

要匹配其他元素,你可以使用更普遍模板

的XSLT處理器首先應該匹配更具體的模板,和所以foo:bar將被忽略,並且所有其他foo元素與其他模板匹配。

因此,例如,給予該輸入XML

<foo:root xmlns:foo="foo.com"> 
    <foo:bar>No match</foo:bar> 
    <foo:pie>Match</foo:pie> 
</foo:root> 

當您申請以下XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:foo="foo.com"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="foo:bar" /> 

    <xsl:template match="foo:*"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

如果你想在FOO做不同的處理:酒吧,只需添加代碼到相關的模板。

以下是輸出,而不FOO的任何跡象:巴

<foo:root xmlns:foo="foo.com"> 
    <foo:pie>Match</foo:pie> 
</foo:root> 
+0

啊太棒了!謝謝。 – stofl

+0

+1以獲得完全正確的解決方案。 –

5

XSLT 1.0:

<xsl:template match="foo:*[not(local-name()='bar')]"> 
    <!--do stuff--> 
</xsl:template> 

XSLT 2.0:

<xsl:template match="foo:*[. except self::foo:bar]"> 
    <!--do stuff--> 
</xsl:template> 
+0

太棒了,比你! – stofl

+0

@_Mads Hnasen:您提出的XSLT 2.0解決方案是錯誤的 - 請更正。 –

+0

感謝@Dimitre Novatchev,我已經在匹配表達式中添加了self ::'軸。 –

相關問題