开发者

XSLT: Match all elements of a namespace except one element

开发者 https://www.devze.com 2023-04-11 11:27 出处:网络
I want to write an XSLT template that matche开发者_运维百科s all elements of one namespace except one element. For example I want to match all elements foo:*, but not foo:bar.

I want to write an XSLT template that matche开发者_运维百科s all elements of one namespace except one element. For example I want to match all elements foo:*, but not foo:bar.

Is that possible to define this in a selector or do I have to write an xsl:if condition within the xsl:template (and how can I test the local name of the element)?


To do this, you can just have a template that matches foo:bar that does nothing with it like so:

<xsl:template match="foo:bar" />

To match other foo elements, you can use a more general template

The XSLT processor should match the more specific template first, and so foo:bar will be ignored, and all other foo elements matched by the other template.

So, for example, given this input XML

<foo:root xmlns:foo="foo.com">
   <foo:bar>No match</foo:bar>
   <foo:pie>Match</foo:pie>
</foo:root>

When you apply the following 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>

If you wanted to do different processing on foo:bar, just add code to the relevant template.

The following is output, without any sign of foo:bar

<foo:root xmlns:foo="foo.com">
   <foo:pie>Match</foo:pie>
</foo:root>


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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号