Oxygen XML Editor
 
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

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
 
© 2002-2008 SyncRO Soft Ltd. All rights reserved. | Sitemap | Privacy Policy
This website was created & generated with <oXygen/> XML Editor
Keywords