|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: Re: Re: Filtering with multiple templates
> I made some progress on this merge matter. Thanks!
>
> However, we don't know how many results we need to
> merge. It depends on user's selection. So, we need to
> dynamically generate the merge script you suggested
> based on the user's selection.
>
> There might just two(v1 and v2). But it may have more
> than two. So, I'm trying to generate a XSLT
> dynamically to handle this merge by using a java
> program.
Probably you could do without generating a new stylesheet.
If you could gather all merges into a single node-set and pass it as
parameter to the transformation, then you can process all the merges in this
single transformation.
For example, this transformation:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
exclude-result-prefixes="ext">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pMerges">
<Member name="x">
<Member name="x" _pos="6"/>
</Member>
<Member name="x">
<Member name="y" _pos="3"/>
</Member>
<Member name="x">
<Member name="z" _pos="4"/>
</Member>
</xsl:param>
<xsl:variable name="vMerges"
select="document('')/*/xsl:param[@name='pMerges']"/>
<xsl:template match="/">
<xsl:variable name="vrtfSrtMerges">
<xsl:for-each select="$vMerges/*">
<xsl:sort select="Member/@_pos" data-type="number"/>
<xsl:copy>
<xsl:copy-of select="@*[not(name()='_pos')]"/>
<xsl:copy-of select="node()"/>
</xsl:copy>
</xsl:for-each>
</xsl:variable>
<xsl:call-template name="merge">
<xsl:with-param name="pMerges"
select="ext:node-set($vrtfSrtMerges)/*"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="merge">
<xsl:param name="pMerges" select="/.."/>
<xsl:for-each select="$pMerges[1]">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:for-each select="$pMerges/*">
<xsl:copy>
<xsl:copy-of select="@*[not(name() = '_pos')]"/>
<xsl:copy-of select="node()"/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
when applied on any source xml (not used), will produce the wanted result:
<Member xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common" name="x">
<Member name="y"/>
<Member name="z"/>
<Member name="x"/>
</Member>
=====
Cheers,
Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








