XSLT:匹配名称空间中除一个元素以外的所有元素

问题描述:

我想编写一个匹配除一个元素之外的其他名称空间的所有元素的XSLT模板。例如,我想匹配所有元素foo:*,但不匹配foo:barXSLT:匹配名称空间中除一个元素以外的所有元素

可以在选择器中定义这个,或者我必须在xsl:template(以及如何测试元素的本地名称)中编写xsl:if条件吗?

+1

XSLT比赛埃尔(和其他节点),而不是标签。一个元素通常有两个标签,一个开始标签和一个结束标签。它可以帮助每个人沟通,如果你试图让术语正确。 –

要做到这一点,你可以有一个相匹配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以获得完全正确的解决方案。 –

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 ::'轴。 –