Hi,
I have a xml as this one:
<?xml version="1.0" encoding="UTF-8"?>
<DATOS>
<FILTRO>
<VER nombre="codVers14" lit="Model" valor="0"/>
<AS nombre="aSalon" lit="Année Modèle" valor="0"/>
<COL nombre="codColor" lit="Couleur" valor="0"/>
<TAP nombre="codTapizado" lit="Garnissage" valor="0"/>
<OPT nombre="codOpciones" lit="OPCIONES" valor="0"/>
</FILTRO>
<COLORES>
<COL cod="C1" lit="Amarillo Heliodoro" ord="1"/>
<COL cod="3H" lit="Azul Grand Pavois" ord="1"/>
<COL cod="3Y" lit="Azul Lucia" ord="1"/>
<COL cod="5K" lit="Azul Mauritius" ord="1"/>
<COL cod="5U" lit="Azul Oriental" ord="1"/>
<COL cod="J4" lit="Beig" ord="1"/>
<COL cod="WP" lit="Blanco Banquise" ord="1"/>
<COL cod="4A" lit="Grilyne" ord="1"/>
<COL cod="ZR" lit="Gris Aluminio" ord="1"/>
<COL cod="YT" lit="Gris Orageux" ord="1"/>
<COL cod="W7" lit="Naranja" ord="1"/>
<COL cod="XY" lit="Negro Onyx" ord="1"/>
<COL cod="X9" lit="Rojo Ardent" ord="1"/>
<COL cod="KQ" lit="Rojo Lucifer" ord="1"/>
<COL cod="JH" lit="Rojo Postes " ord="1"/>
<COL cod="7Z" lit="Verde Hurlevent" ord="1"/>
<COL cod="8Y" lit="Verde Lenz" ord="1"/>
</COLORES>
<VERSIONES>
<V14 cod="1CA8A5J6P5..A0" lit="11i Sx Plus" ord="9800009">
<V16 cod="1CA8A5J6P501A031" as="31">
<VEH codcol="3H" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="XY" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="ZR" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="ZR" codtap="Z2FT" tap="Z2FT" opt="58H8"/>
<VEH codcol="YT" codtap="Z2FT" tap="Z2FT" opt="58H8"/>
<VEH codcol="XY" codtap="Z2FT" tap="Z2FT" opt="58H8"/>
<VEH codcol="3Y" codtap="Z2FT" tap="Z2FT" opt="58H8"/>
<VEH codcol="8Y" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="KQ" codtap="Z2FT" tap="Z2FT" opt="58H8"/>
<VEH codcol="KQ" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="3Y" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
</V16>
</V14>
<V14 cod="1CA8A5J7P5..A0" lit="14 Hdi 70cv Sx Plus" ord="9800080">
<V16 cod="1CA8A5J7P501A031" as="31">
<VEH codcol="3H" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="5U" codtap="Z2FT" tap="Z2FT" opt="58J0"/>
<VEH codcol="7Z" codtap="Z2FT" tap="Z2FT" opt="58J0"/>
<VEH codcol="8Y" codtap="Z2FT" tap="Z2FT" opt="58J0"/>
<VEH codcol="8Y" codtap="Z2FT" tap="Z2FT" opt="95HC"/>
<VEH codcol="J4" codtap="Z2FT" tap="Z2FT" opt="58H9"/>
<VEH codcol="J4" codtap="Z2FT" tap="Z2FT" opt="58J0"/>
<VEH codcol="J4" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="KQ" codtap="Z2FT" tap="Z2FT" opt="95HC"/>
<VEH codcol="WP" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="X9" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="XY" codtap="Z2FT" tap="Z2FT" opt="58H9"/>
<VEH codcol="XY" codtap="Z2FT" tap="Z2FT" opt="95HC"/>
<VEH codcol="XY" codtap="Z2FZ" tap="Z2FZ" opt="58H9"/>
<VEH codcol="XY" codtap="Z2FZ" tap="Z2FZ" opt="95HC"/>
<VEH codcol="YT" codtap="Z2FT" tap="Z2FT" opt="58H9"/>
<VEH codcol="ZR" codtap="Z2FT" tap="Z2FT" opt="58J0"/>
<VEH codcol="ZR" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="ZR" codtap="Z2FZ" tap="Z2FZ" opt="WL45"/>
</V16>
<V16 cod="1CA8A5J7P501A030" as="30">
<VEH codcol="3H" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="5U" codtap="Z2FT" tap="Z2FT" opt="58J0"/>
<VEH codcol="7Z" codtap="Z2FT" tap="Z2FT" opt="58J0"/>
<VEH codcol="8Y" codtap="Z2FT" tap="Z2FT" opt="58J0"/>
<VEH codcol="8Y" codtap="Z2FT" tap="Z2FT" opt="95HC"/>
<VEH codcol="J4" codtap="Z2FZ" tap="Z2FZ" opt="58H9"/>
<VEH codcol="J4" codtap="Z2FT" tap="Z2FT" opt="58J0"/>
<VEH codcol="J4" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="KQ" codtap="Z2FT" tap="Z2FT" opt="95HC"/>
<VEH codcol="WP" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="X9" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="XY" codtap="Z2FT" tap="Z2FT" opt="58H9"/>
<VEH codcol="XY" codtap="Z2FT" tap="Z2FT" opt="95HC"/>
<VEH codcol="XY" codtap="Z2FZ" tap="Z2FZ" opt="58H9"/>
<VEH codcol="XY" codtap="Z2FZ" tap="Z2FZ" opt="95HC"/>
<VEH codcol="YT" codtap="Z2FT" tap="Z2FT" opt="58H9"/>
<VEH codcol="ZR" codtap="Z2FT" tap="Z2FT" opt="58J0"/>
<VEH codcol="ZR" codtap="Z2FT" tap="Z2FT" opt="WL45"/>
<VEH codcol="ZR" codtap="Z2FZ" tap="Z2FZ" opt="WL45"/>
</V16>
</V14>
</VERSIONES>
</DATOS>
And with this xsl I obtain the 'selects' that i need:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="v14" select="0"/><!-- 1CA8A5J6P5..A0 1CA8A5J7P5..A0
-->
<xsl:param name="as" select="0"/><!-- 30 31 -->
<xsl:param name="color" select="0"/> <!-- J4 -->
<xsl:param name="tap" select="0"/> <!-- Z2FT Z2FZ -->
<xsl:key name="a" match="V16" use="@as"/>
<xsl:key name="a1" match="V16" use="concat(../@cod,'+',@as)"/>
<xsl:key name="c" match="VEH"
use="concat(../../@cod,'+',../@as,'+',@codcol)"/>
<xsl:key name="c1" match="VEH" use="concat(../../@cod,'+',@codcol)"/>
<xsl:key name="c2" match="VEH" use="concat(../@as,'+',@codcol)"/>
<xsl:key name="c3" match="VEH" use="@codcol"/>
<xsl:key name="t8" match="VEH"
use="concat(../../@cod,'+',../@as,'+',@codcol,'+',@tap)"/>
<xsl:key name="t7" match="VEH"
use="concat(../../@cod,'+',../@as,'+',@tap)"/>
<xsl:key name="t6" match="VEH"
use="concat(../../@cod,'+',@codcol,'+',@tap)"/>
<xsl:key name="t5" match="VEH" use="concat(../../@cod,'+',@tap)"/>
<xsl:key name="t4" match="VEH" use="concat(../@as,'+',@codcol,'+',@tap)"/>
<xsl:key name="t3" match="VEH" use="concat(../@as,'+',@tap)"/>
<xsl:key name="t2" match="VEH" use="concat(@codcol,'+',@tap)"/>
<xsl:key name="t1" match="VEH" use="@tap"/>
<xsl:key name="colores" match="COL" use="@cod"/>
<xsl:template match="/DATOS">
<table border="0">
<xsl:variable name="clase" select="//LIT/@MARCA"/>
<tr>
<td>
<xsl:attribute name="class"><xsl:value-of
select="$clase"/></xsl:attribute>
<xsl:value-of select="//FILTRO/VER/@lit"/>
</td>
<td>
<xsl:attribute name="class"><xsl:value-of
select="$clase"/></xsl:attribute>
<select onchange="doCargarVersiones()">
<xsl:attribute name="name"><xsl:value-of
select="//FILTRO/VER/@nombre"/></xsl:attribute>
<option value="0">
<xsl:value-of select="//LIT/@SELECCIONE"/>
</option>
<xsl:for-each select="//V14">
<xsl:sort select="@ord" data-type="number" order="ascending"/>
<xsl:sort select="@lit" data-type="text" order="ascending"/>
<OPTION>
<xsl:if test="@cod=$v14">
<xsl:attribute name="selected"/>
</xsl:if>
<xsl:attribute name="value"><xsl:value-of
select="@cod"/></xsl:attribute>
<xsl:attribute name="orden"><xsl:value-of
select="@ord"/></xsl:attribute>
<xsl:value-of select="@lit"/>
</OPTION>
</xsl:for-each>
</select>
</td>
<td>
<xsl:attribute name="class"><xsl:value-of
select="$clase"/></xsl:attribute>
<xsl:value-of select="//FILTRO/AS/@lit"/>
</td>
<td>
<xsl:attribute name="class"><xsl:value-of
select="$clase"/></xsl:attribute>
<select onchange="doCargarASalon()">
<xsl:attribute name="name"><xsl:value-of
select="//FILTRO/AS/@nombre"/></xsl:attribute>
<option value="0">
<xsl:value-of select="//LIT/@SELECCIONE"/>
</option>
<xsl:if test="$v14='0'">
<xsl:apply-templates
select="//V14/V16[generate-id()=generate-id(key('a',@as)[1])]/@as">
<xsl:sort select="." order="ascending" data-type="number"/>
</xsl:apply-templates>
</xsl:if>
<xsl:if test="$v14!='0'">
<xsl:apply-templates
select="//V14[(_at_)cod=$v14]/V16[generate-id()=generate-id(key('a1',concat($v14,'+',@as))[1])]/@as">
<xsl:sort select="." order="ascending" data-type="number"/>
</xsl:apply-templates>
</xsl:if>
</select>
</td>
</tr>
<tr>
<td>
<xsl:attribute name="class"><xsl:value-of
select="$clase"/></xsl:attribute>
<xsl:value-of select="//FILTRO/COL/@lit"/>
</td>
<td>
<xsl:attribute name="class"><xsl:value-of
select="$clase"/></xsl:attribute>
<select onchange="doCargarColores()">
<xsl:attribute name="name"><xsl:value-of
select="//FILTRO/COL/@nombre"/></xsl:attribute>
<option value="0">
<xsl:value-of select="//LIT/@SELECCIONE"/>
</option>
<xsl:choose>
<xsl:when test="$v14='0' and $as='0'">
<xsl:apply-templates select="//COL/@cod">
<xsl:sort select="../@lit" data-type="text"
order="ascending"/>
</xsl:apply-templates>
</xsl:when>
<xsl:when test="$v14='0' and $as!='0'">
<xsl:apply-templates select="//COL[(_at_)cod =
//V14/V16[(_at_)as=$as]/VEH[generate-id()=generate-id(key('c2',concat($as,'+',@codcol))[1])]/@codcol]/
@cod">
<xsl:sort select="../@lit" data-type="text"
order="ascending"/>
</xsl:apply-templates>
</xsl:when>
<xsl:when test="$v14!='0' and $as='0'">
<xsl:apply-templates select="//COL[(_at_)cod =
//V14[(_at_)cod=$v14]//V16/VEH[generate-id()=generate-id(key('c1',concat($v14,'+',@codcol))[1])]/@codcol]/@cod">
<xsl:sort select="../@lit" data-type="text"
order="ascending"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="//COL[(_at_)cod =
//V14[(_at_)cod=$v14]/V16[(_at_)as=$as]/VEH[generate-id()=generate-id(key('c',concat($v14,'+',$as,'+',@codcol))[1])]/@codcol]/@cod">
<xsl:sort select="../@lit" data-type="text"
order="ascending"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</select>
</td>
<td>
<xsl:attribute name="class"><xsl:value-of
select="$clase"/></xsl:attribute>
<xsl:value-of select="//FILTRO/TAP/@lit"/>
</td>
<td>
<xsl:attribute name="class"><xsl:value-of
select="$clase"/></xsl:attribute>
<select>
<xsl:attribute name="name"><xsl:value-of
select="//FILTRO/TAP/@nombre"/></xsl:attribute>
<option value="0">
<xsl:value-of select="//LIT/@SELECCIONE"/>
</option>
<xsl:if test="$v14='0'">
<xsl:if test="$as='0'">
<xsl:if test="$color='0'">
<xsl:apply-templates
select="//VEH[generate-id()=generate-id(key('t1',@tap)[1])]/@tap">
<xsl:sort select="." data-type="text"
order="ascending"/>
</xsl:apply-templates>
</xsl:if>
<xsl:if test="$color!='0'">
<xsl:apply-templates
select="//VEH[generate-id()=generate-id(key('t2',concat($color,'+',@tap))[1])]/@tap">
<xsl:sort select="." data-type="text"
order="ascending"/>
</xsl:apply-templates>
</xsl:if>
</xsl:if>
<xsl:if test="$as!='0'">
<xsl:if test="$color='0'">
<xsl:apply-templates
select="//VEH[generate-id()=generate-id(key('t3',concat($as,'+',@tap))[1])]/@tap">
<xsl:sort select="." data-type="text"
order="ascending"/>
</xsl:apply-templates>
</xsl:if>
<xsl:if test="$color!='0'">
<xsl:apply-templates
select="//VEH[generate-id()=generate-id(key('t4',concat($as,'+',$color,'+',@tap))[1])]/@tap">
<xsl:sort select="." data-type="text"
order="ascending"/>
</xsl:apply-templates>
</xsl:if>
</xsl:if>
</xsl:if>
<xsl:if test="$v14!='0'">
<xsl:if test="$as='0'">
<xsl:if test="$color='0'">
<xsl:apply-templates
select="//VEH[generate-id()=generate-id(key('t5',concat($v14,'+',@tap))[1])]/@tap">
<xsl:sort select="." data-type="text"
order="ascending"/>
</xsl:apply-templates>
</xsl:if>
<xsl:if test="$color!='0'">
<xsl:apply-templates
select="//VEH[generate-id()=generate-id(key('t6',concat($v14,'+',$color,'+',@tap))[1])]/@tap">
<xsl:sort select="." data-type="text"
order="ascending"/>
</xsl:apply-templates>
</xsl:if>
</xsl:if>
<xsl:if test="$as!='0'">
<xsl:if test="$color='0'">
<xsl:apply-templates
select="//VEH[generate-id()=generate-id(key('t7',concat($v14,'+',$as,'+',@tap))[1])]/@tap">
<xsl:sort select="." data-type="text"
order="ascending"/>
</xsl:apply-templates>
</xsl:if>
<xsl:if test="$color!='0'">
<xsl:apply-templates
select="//VEH[generate-id()=generate-id(key('t8',concat($v14,'+',$as,'+',$color,'+',@tap))[1])]/@tap">
<xsl:sort select="." data-type="text"
order="ascending"/>
</xsl:apply-templates>
</xsl:if>
</xsl:if>
</xsl:if>
</select>
</td>
</tr>
</table>
</xsl:template>
<xsl:template match="@as">
<OPTION>
<xsl:if test=".=$as">
<xsl:attribute name="selected"/>
</xsl:if>
<xsl:attribute name="value"><xsl:value-of select="."/></xsl:attribute>
<xsl:value-of select="."/>
</OPTION>
</xsl:template>
<xsl:template match="//COL/@cod">
<OPTION>
<xsl:if test=".=$color">
<xsl:attribute name="selected"/>
</xsl:if>
<xsl:attribute name="value"><xsl:value-of select="."/></xsl:attribute>
<xsl:value-of select="../@lit"/>
</OPTION>
</xsl:template>
<xsl:template match="@tap">
<OPTION>
<xsl:attribute name="value"><xsl:value-of
select="../@codtap"/></xsl:attribute>
<xsl:value-of select="."/>
</OPTION>
</xsl:template>
</xsl:stylesheet>
Now I want to add another 'select', ('opciones'), if I use the same form to
refill it, the number of different combinations it turns almost impossible.
There is another form to do it?
I tried with something like this:
<xsl:key name="o4" match="VEH" use="concat(@codcol,'+',@tap,'+',@opt)"/>
<xsl:key name="o3" match="VEH" use="concat(@codcol,'+',@opt)"/>
<xsl:key name="o2" match="VEH" use="concat(@tap,'+',@opt)"/>
<xsl:key name="o1" match="VEH" use="@opt"/>
<!-- ... -->
<td>
<xsl:attribute name="class"><xsl:value-of
select="$clase"/></xsl:attribute>
<select>
<xsl:attribute name="name"><xsl:value-of
select="//FILTRO/OPT/@nombre"/></xsl:attribute>
<option value="0">
<xsl:value-of select="//LIT/@SELECCIONE"/>
</option>
<!--xsl:apply-templates
select="//V14[(_at_)cod=$v14 or $v14='0']/V16[(_at_)as=$as or
$as='0']/VEH[generate-id()=generate-id(key('o1',@opt)[1])]/@opt">
<xsl:sort select="." data-type="text" order="ascending"/>
</xsl:apply-templates-->
<xsl:choose>
<xsl:when test="$color!='0' and $tap!='0'">
<xsl:apply-templates
select="//V14[(_at_)cod=$v14 or $v14='0']/V16[(_at_)as=$as or
$as='0']/VEH[generate-id()=generate-id(key('o4',concat($color,'+',$tap,'+',@opt))[1])]/@opt">
<xsl:sort select="." data-type="text" order="ascending"/>
</xsl:apply-templates>
</xsl:when>
<xsl:when test="$color!='0' and $tap='0'">
<xsl:apply-templates
select="//V14[(_at_)cod=$v14 or $v14='0']/V16[(_at_)as=$as or
$as='0']/VEH[generate-id()=generate-id(key('o3',concat($color,'+',@opt))[1])]/@opt">
<xsl:sort select="." data-type="text" order="ascending"/>
</xsl:apply-templates>
</xsl:when>
<xsl:when test="$color='0' and $tap!='0'">
<xsl:apply-templates
select="//V14[(_at_)cod=$v14 or $v14='0']/V16[(_at_)as=$as or
$as='0']/VEH[generate-id()=generate-id(key('o2',concat($tap,'+',@opt))[1])]/@opt">
<xsl:sort select="." data-type="text" order="ascending"/>
</xsl:apply-templates>
</xsl:when>
<xsl:when test="$color='0' and $tap='0'">
<xsl:apply-templates
select="//V14[(_at_)cod=$v14 or $v14='0']/V16[(_at_)as=$as or
$as='0']/VEH[generate-id()=generate-id(key('o1',@opt)[1])]/@opt">
<xsl:sort select="." data-type="text" order="ascending"/>
</xsl:apply-templates>
</xsl:when>
</xsl:choose>
</select>
</td>
<!-- ... -->
<xsl:template match="@opt">
<OPTION>
<xsl:attribute name="value"><xsl:value-of select="."/></xsl:attribute>
<xsl:value-of select="."/>
</OPTION>
</xsl:template>
But it doesn't work in all the cases, some options are absent in the
'select' that they should be there.
For example, if i put:
<xsl:param name="v14" select="'1CA8A5J7P5..A0'"/><!-- 1CA8A5J6P5..A0
1CA8A5J7P5..A0 -->
<xsl:param name="as" select="'31'"/>
<xsl:param name="color" select="0"/> <!-- J4 -->
<xsl:param name="tap" select="0"/> <!-- Z2FT Z2FZ -->
the options in the select must be: 'WL45, 58J0, 95HC, 58H9' but there are
only '58J0, 95HC, 58H9'.
I hope that someone can help me, and say how to optimize this xsl.
Thanks for all.
_________________________________________________________________
Latinos en EE.UU: noticias y artículos de interés para ti
http://latino.msn.com/noticias/latinoseneeuu