XSLT:匹配名称空间中除一个元素以外的所有元素
我想编写一个匹配除一个元素之外的其他名称空间的所有元素的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比赛埃尔(和其他节点),而不是标签。一个元素通常有两个标签,一个开始标签和一个结束标签。它可以帮助每个人沟通,如果你试图让术语正确。 –