xsl-list
[Top] [All Lists]

Problems selecting nodes

2004-05-12 06:40:29
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



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