Hey Henry,
I took only a slightly different approach (still using the node-set
extension) to solve my problem:
<xsl:variable name="cat_temp">
<xsl:for-each select="$category_blog" >
<xsl:element name="category">
<xsl:attribute name="name"><xsl:value-of select="@name"
/></xsl:attribute>
<xsl:attribute name="type"><xsl:value-of select="@type"
/></xsl:attribute>
<xsl:attribute name="mode">blog</xsl:attribute>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="$category_podcast" >
<xsl:element name="category">
<xsl:attribute name="name"><xsl:value-of select="@name"
/></xsl:attribute>
<xsl:attribute name="type"><xsl:value-of select="@type"
/></xsl:attribute>
<xsl:attribute name="mode">podcast</xsl:attribute>
</xsl:element>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="category_defs" select="exsl:node-set($cat_temp)/category" />
It wasn't important that the nodes be actually copied, so much as the
data be collected into a common set. Later I just sort these and the
results are interleaved exactly as I wanted.
Thanks,
Ray
On Mon, 2007-08-13 at 09:17 -0400, Henry Zongaro wrote:
>
> Hi, Raymond.
>
> Raymond <[EMAIL PROTECTED]> wrote on 2007-08-10 12:55:19 PM:
> > I'm wondering if there is anyway to achieve something like this:
> >
> > <xsl:variable name="category_defs">
> > <xsl:for-each select="$category_defs1" >
> > <xsl:copy>
> > <xsl:attribute name="mode">1</xsl:attribute>
> > </xsl:copy>
> > </xsl:for-each>
> > <xsl:for-each select="$category_defs2" >
> > <xsl:copy>
> > <xsl:attribute name="mode">2</xsl:attribute>
> > </xsl:copy>
> > </xsl:for-each>
> > </xsl:variable>
> >
>
> > Essentially, what I'm trying to do is merge the two result sets into
> > one interleaved set, while maintaining the distinction between the
> > two by applying a "mode" attribute.
>
> According to section 11.1 of XSLT 1.0,[1] "An operation is permitted
> on a result tree fragment only if that operation would be permitted on
> a string (the operation on the string may involve first converting the
> string to a number or boolean)." So in standard XSLT, you can't do
> it. To be able to access the nodes in a result tree fragment and
> directly manipulate them, you need to use the node-set extension
> function. Something like the following should work:
>
> <xsl:variable name="category_defs"
> xmlns:exslt="http://exslt.org/common">
> <xsl:for-each select="exslt:node-set($category_defs1)/node()" >
> <xsl:copy>
> <xsl:attribute name="mode">1</xsl:attribute>
> </xsl:copy>
> </xsl:for-each>
> <xsl:for-each select="exslt:node-set($category_defs2)/node()" >
> <xsl:copy>
> <xsl:attribute name="mode">2</xsl:attribute>
> </xsl:copy>
> </xsl:for-each>
> </xsl:variable>
>
> I hope that helps.
>
> Thanks,
>
> Henry
> [1] http://www.w3.org/TR/xslt#section-Result-Tree-Fragments
> ------------------------------------------------------------------
> Henry Zongaro XSLT Processors Development
> IBM SWS Toronto Lab T/L 969-6044; Phone +1 905 413-6044
> mailto:[EMAIL PROTECTED]
Raymond Auge <[EMAIL PROTECTED]>
Software Engineer
Liferay, Inc.
Enterprise. Open Source. For Life.