我想编写一个XSLT模板,该模板匹配除一个元素之外的一个命名空间的所有元素。例如,我想匹配所有元素foo:*
,但不匹配foo:bar
。
可以在选择器中定义它,还是必须在xsl:if
内编写xsl:template
条件(如何测试元素的本地名称)?
答案 0 :(得分:5)
要做到这一点,你可以拥有一个匹配 foo:bar 的模板,它不会像这样做:
<xsl:template match="foo:bar" />
要匹配其他 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>
应用以下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:bar 进行不同的处理,只需将代码添加到相关模板即可。
输出以下内容,没有任何 foo:bar
的迹象<foo:root xmlns:foo="foo.com">
<foo:pie>Match</foo:pie>
</foo:root>
答案 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>