RE: [xsl] very Simple nested for each loops...

Subject: RE: [xsl] very Simple nested for each loops...
From: Américo Albuquerque <melinor@xxxxxxx>
Date: Thu, 7 Aug 2003 00:43:39 +0100
Hi.

> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> Andy.Benson@xxxxxxx
> Sent: Wednesday, August 06, 2003 4:52 PM
> To: XSL-List@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] very Simple nested for each loops...
> 
> 
> Hi I have some simple perl code that I want to convert into a 
> XSL stylesheet. The variables $set1 and $set2 would be 
> configured in XML. Any simple suggestions are very welcome.
> 
> best regards
> 
> Andy
> 
> 
> 

This can be done using a config file where you can set the rules to work.
Main xml file:
<mux>
  <set1>1</set1>
  <set2>0</set2>
</mux>

XML config file:
<config>
  <set name="set1" on="1">
    <letters>
      <letter value="a"/>
      <letter value="b"/>
    </letters>
    <numbers>
      <number value="0"/>
      <number value="1"/>
      <number value="2"/>
      <number value="3"/>
    </numbers>
  </set>
  <set name="set2">
    <letters>
      <letter value="x"/>
      <letter value="y"/>
      <letter value="z"/>
    </letters>
    <numbers>
      <number value="0"/>
      <number value="1"/>
      <number value="2"/>
      <number value="3"/>
      <number value="4"/>
      <number value="5"/>
    </numbers>
  </set>
</config>

Stylesheet:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:output method="text"/>
  <xsl:template match="mux">
    <xsl:variable name="cnfg" select="document('config.xml')/config"/>
    <xsl:apply-templates select="document('config.xml')/config/*">
      <xsl:with-param name="sets" select="current()/*"/>
    </xsl:apply-templates>
  </xsl:template>
  <xsl:template match="set">
    <xsl:param name="sets" select="/.."/>
    <xsl:apply-templates mode="mux" select="$sets[name()=current()/@name and
normalize-space()=current()/@on]">
      <xsl:with-param name="letters" select="current()/letters"/>
      <xsl:with-param name="numbers" select="current()/numbers"/>
    </xsl:apply-templates>
  </xsl:template>
  <xsl:template match="*" mode="mux">
    <xsl:param name="letters" select="/.."/>
    <xsl:param name="numbers" select="/.."/>
    <xsl:for-each select="$letters/letter">
      <xsl:variable name="letter" select="@value"/>
      <xsl:for-each select="$numbers/number">
        <xsl:value-of select="$letter"/>
        <xsl:value-of select="@value"/>
        <xsl:text> &#10;</xsl:text>
      </xsl:for-each>
      <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Hope this helps you.

Regards,
Americo Albuquerque

(...)


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread