Subject: Re: Catch ALL | Failed template rule
From: Karl Stubsjoen <kstubs@xxxxxxxxx>
Date: Tue, 22 Mar 2005 12:49:59 -0700
|
Consider the following:
Transform XML into XML. The resulting XML will be a series of pass
and fails where specific template rules have a match. So you might be
asking questions like, does my element have an attribute "a" who's
value is "b"? Or actually, you'd ask the question: if my element has
an attribute "a" who's value is "b" then append the attribute "pass" =
"1" to the resulting XML, otherwise, append the attribute "pass" =
"0".
Example XML:
<foo>
<bar a="c"/>
<bar a="b"/><!-- passes -->
<bar a="a"/>
<bar a="b"/><!-- passes -->
</abc>
You would then:
<xsl:apply-template select="foo/bar[@a='b']" mode="matchedresults"/>
And match on:
<xsl:template match="bar" mode="matchedresults">
<!-- append element "pass" = "1"-->
</xsl:template>
At this point, there is no way to have an "unmatched" template result,
and this does make sense to me. I guess I was looking for the
cleanest way to exercise this. I guess it would be this:
<xsl:apply-template select="not(foo/bar[@a='b'])" mode="unmatchedresults"/>
On Tue, 22 Mar 2005 18:12:57 +1100, Dimitre Novatchev
<dnovatchev@xxxxxxxxx> wrote:
> I know that the OP meant something completely different, but probably
> what seems as an appropriate answer to the question expressed in the
> title of this thread is:
>
> the builtin rules.
>
> It is a good practice to have them explicitly in one's code (with the
> least priority possible) and to put breakpoints on them (in a good
> XSLT IDE with a debugger), whenever one gets unexpected output that no
> other template is supposed to produce.
>
> I find this meaning of "catch all" more natural and intuitive.
>
> Cheers,
> Dimitre Novatchev.
>
>
> On Mon, 21 Mar 2005 08:03:06 -0700, Karl Stubsjoen <kstubs@xxxxxxxxx> wrote:
> > I'd like a catch ALL template rule, actually a catch NOT template
> > rule. In an effort to check for the existence of a select, I have
> > setup a match template rule that simply returns "1" for a match. So I
> > have:
> >
> > <xsl:template match="record" mode="recordexists">
> > <xsl:text>1</xsl:text>
> > </xsl:template>
> >
> > The failed select would need to return a "0". So I need a match that
> > simply returns 0.
> >
> > So something like:
> >
> > <xsl:template match="not(record)" mode="recordexists">
> > <xsl:text>0</xsl:text>
> > </xsl:template>
> >
> > (which is not a legal match statement, but that is what I need). I'm
> > sure there is a way, and I'm sure it is obvious! Just not coming to
> > me.
> >
> > Thanks,
> > Karl
|