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

sto*_*ofl 3 xslt

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

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

Tim*_*m C 5

要做到这一点,你可以拥有一个匹配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)


Mad*_*sen 5

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)