xsl-list
[Top] [All Lists]

Re: Filtering with multiple templates

2003-11-06 22:53:21
We need to allow multiple templates to select some of
members. for example,

the first template will get:
<Member name="x">
  <Member name="z"/>
</Member>

the second template will get:
<Member name="x">
  <Member name="w"/>
</Member>

If we run this two templates sequentially, we will
get:
<Member name="x">
  <Member name="z"/>
</Member>
<Member name="x">
  <Member name="w"/>
</Member>

But we want to get the following based on the original
structure:

<Member name="x">
  <Member name="z"/>
  <Member name="w"/>
</Member>

Please provide any idea that might help. Thanks a lot.


The output of applying two templates can be merged like this:

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:template match="/">
    <xsl:variable name="vrtfOut">
      <xsl:call-template name="t1"/>
      <xsl:call-template name="t2"/>
    </xsl:variable>

    <xsl:variable name="vOut" select="ext:node-set($vrtfOut)/*"/>
    <xsl:for-each select="$vOut[1]">
      <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:copy-of select="../*/*"/>
      </xsl:copy>
    </xsl:for-each>
  </xsl:template>

  <xsl:template name="t1">
    <Member name="x">
      <Member name="z"/>
    </Member>
  </xsl:template>

  <xsl:template name="t2">
    <Member name="x">
      <Member name="w"/>
    </Member>
  </xsl:template>

</xsl:stylesheet>

when applied on any source.xml (not used), produces:

<Member name="x">
   <Member name="z"/>
   <Member name="w"/>
</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>