xsl-list
[Top] [All Lists]

Re: Re: Re: Filtering with multiple templates

2003-11-10 23:33:29
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[(_at_)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



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