我想編寫一個匹配除一個元素之外的其他名稱空間的所有元素的XSLT模板。例如,我想匹配所有元素foo:*
,但不匹配foo:bar
。XSLT:匹配名稱空間中除一個元素以外的所有元素
可以在選擇器中定義這個,或者我必須在xsl:template
(以及如何測試元素的本地名稱)中編寫xsl:if
條件嗎?
我想編寫一個匹配除一個元素之外的其他名稱空間的所有元素的XSLT模板。例如,我想匹配所有元素foo:*
,但不匹配foo:bar
。XSLT:匹配名稱空間中除一個元素以外的所有元素
可以在選擇器中定義這個,或者我必須在xsl:template
(以及如何測試元素的本地名稱)中編寫xsl:if
條件嗎?
要做到這一點,你可以有一個相匹配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>
啊太棒了!謝謝。 – stofl
+1以獲得完全正確的解決方案。 –
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>
太棒了,比你! – stofl
@_Mads Hnasen:您提出的XSLT 2.0解決方案是錯誤的 - 請更正。 –
感謝@Dimitre Novatchev,我已經在匹配表達式中添加了self ::'軸。 –
XSLT比賽埃爾(和其他節點),而不是標籤。一個元素通常有兩個標籤,一個開始標籤和一個結束標籤。它可以幫助每個人溝通,如果你試圖讓術語正確。 –