"Dongling Ding" <dling61(_at_)yahoo(_dot_)com> wrote in message
news:20031124022747(_dot_)86939(_dot_)qmail(_at_)web13908(_dot_)mail(_dot_)yahoo(_dot_)com(_dot_)(_dot_)(_dot_)
Hi,
I want to perform a filering out transformation to a
source file. I copy most things, but leave out specfic
parts.
The left out part can be done like this:
<xsl:template match="execluded-nodes">
"do nothing"
</xsl:template>
<xsl:template match="child::Member[(_at_)name ='acc1']"/>
There is a problem with this approach. It seems like
you only can specify "child" or "attribute" in the
match pattern.
What can I do if I want to execlude all the nodes
having the same level as a selected nodel?
There is no restriction on the axis that can be used within *predicates* of
the match pattern. The only restriction in the predicates (in XSLT 1.0) is
that no variable references are allowed.
Therefore, you can specify the restricting condition like this:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(preceding-sibling::*)]">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[preceding-sibling::*]"/>
</xsl:stylesheet>
When this transformation is applied on the following source.xml:
<a>
<b/>
<c/>
<d/>
</a>
the wanted result is produced:
<a>
<b/>
</a>
In case the condition contains a reference to an xsl:variable or an
xsl:param, then this condition cannot be specified as part of the match
pattern. I such a case one can test for the condition within the code of the
template and do nothing if the condition is not satisfied -- this can be
accomplished using an xsl:if
Hope this helped.
=====
Cheers,
Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list