[xsl] Selecting all repeated elements

Subject: [xsl] Selecting all repeated elements
From: Jason Foster <jason.foster@xxxxxxxxxxx>
Date: Fri, 7 Jul 2006 13:41:20 -0400
I've been hunting for an elegant way to obtain a sequence containing those elements that share a common attribute (in this case <course> elements with the same "code" attribute. I think that I've got a kludged solution using <xsl:for-each> as follows:

<xsl:for-each select="child::course">
<xsl:variable name="targetCode" select="attribute::code"/>
<xsl:variable name="duplicates">
<if test="count(/descendant::course[attribute::code = $targetCode]) > 1">
<xsl:value-of select="concat(attribute::code,ancestor::term/ attribute::name, ' ')"/>
</xsl:if>
</xsl:variable>
</xsl:for-each>


This is ugly, and the result isn't a nodeset, so in general I'm not impressed. The thing I haven't been able to figure out is whether XPath has something equivalent to a RegExp backreference, which would allow something like:

<xsl:variable
name="duplicates"
select="child::course[count(/descendant::course [attribute::code=???]) &gt; 1]"
/>


The trick is what should replace ???

Any assistance would be greatly appreciated. For what's it's worth, I'm using XSLT to generate a linear program that represents the courses our students can take in order to find out what's the smallest number of hours that they'll experience over their program. Sometimes they can choose courses in multiple locations during their program.

Thanks!

Jason Foster

Current Thread