RE: [xsl] XPath for matching multiple child elements

Subject: RE: [xsl] XPath for matching multiple child elements
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Thu, 28 Sep 2006 13:09:45 -0400

At 12:49 PM 9/28/2006, Mike wrote:
> <xsl:template match="comments//(h1|p|b|i)">
> A syntax like that would be much more fun to maintain and
> adjust than writing out all of the combinations, like so:
> <xsl:template match="comments//h1 | comments//p | comments//b
> | comments//i">
> I'm using XSLT 2.0 and SaxonB 8.something.  Is there some
> obvious solution that I have missed?

Unfortunately while the above is legal in XPath 2.0 in an expression, it's
still not allowed in a pattern - the syntax of patterns is much more

But it's free enough to support a bit of a workaround, even if you have no schema:

<xsl:variable name="comment-elements" select="//comments//(h1|p|b|i)"/>

<xsl:template match="*[exists(. intersect $comment-elements)]">

I think this should work. (It worked in a little test instance I tried.) Basically the predicate says "match this if it's one of the $comment-elements".

Another way to do this is with XSLT 2.0 pipelining. Pass the document through an identity transform that flags the elements with an attribute; then on the second pass match the elements that have the attribute. That might work better in cases where you have many different kinds of these things.

I hope that helps.


Current Thread