XSLT:匹配除一个元素之外的命名空间的所有元素

时间:2011-10-06 16:28:27

标签: xslt

我想编写一个XSLT模板,该模板匹配除一个元素之外的一个命名空间的所有元素。例如,我想匹配所有元素foo:*,但不匹配foo:bar

可以在选择器中定义它,还是必须在xsl:if内编写xsl:template条件(如何测试元素的本地名称)?

2 个答案:

答案 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>