我想编写一个XSLT模板,该模板匹配除一个元素之外的一个命名空间的所有元素.例如,我想匹配所有元素foo:*
,但不是foo:bar
.
是可以在选择器中定义它还是我必须在其中编写xsl:if
条件xsl:template
(以及如何测试元素的本地名称)?
要做到这一点,你可以拥有一个匹配foo:bar的模板,它不会像这样做:
<xsl:template match="foo:bar" />
Run Code Online (Sandbox Code Playgroud)
要匹配其他foo元素,您可以使用更通用的模板
XSLT处理器应该首先匹配更具体的模板,因此将忽略foo:bar,并且所有其他foo元素与另一个模板匹配.
因此,例如,给定此输入XML
<foo:root xmlns:foo="foo.com">
<foo:bar>No match</foo:bar>
<foo:pie>Match</foo:pie>
</foo:root>
Run Code Online (Sandbox Code Playgroud)
应用以下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>
Run Code Online (Sandbox Code Playgroud)
如果你想对foo:bar进行不同的处理,只需将代码添加到相关模板即可.
输出如下,没有任何foo标志:bar
<foo:root xmlns:foo="foo.com">
<foo:pie>Match</foo:pie>
</foo:root>
Run Code Online (Sandbox Code Playgroud)
XSLT 1.0:
<xsl:template match="foo:*[not(local-name()='bar')]">
<!--do stuff-->
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
XSLT 2.0:
<xsl:template match="foo:*[. except self::foo:bar]">
<!--do stuff-->
</xsl:template>
Run Code Online (Sandbox Code Playgroud)