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
Will,

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
restrictive....

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)]">
   ...
</xsl:template>

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.

Cheers,
Wendell

Current Thread