xsl-list
[Top] [All Lists]

RE: only display if subnodes occur more than once

2005-06-24 00:35:16
 
Anrew Welch wrote:
 
<xsl:template match="sub_a|sub_b|sub_c">
  <xsl:variable name="copy"
select="boolean(*/following-sibling::*[local-name() = 
preceding-sibling::*/local-name()])"/>

  <xsl:if test="$copy">
    <xsl:copy-of select="."/>
  </xsl:if>
</xsl:template>

<xsl:if test="boolean(*/following-sibling::*[local-name() =
preceding-sibling::*/local-name()])"> works fine for my needs - thank
you very much! Could'nt have done it without you!


But it's probably O(n^3) in the number of siblings, so don't try it if
there's a large fanout.

Also the original post asked for all the elem_2's to be output: this code
surely omits the last one?

A 2.0 solution that's likely to be more efficient is

<xsl:for-each-group select="*" group-by="local-name()">
  <xsl:if test="current-group()[2]">
    <xsl:copy-of select="current-group()"/>
  </xsl:if>
</xsl:for-each>

(However, this doesn't preserve the order of the children. The OP didn't say
whether that was a requirement.)

Michael Kay
http://www.saxonica.com/ 



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>