Avatar billede big_ossi Nybegynder
04. august 2005 - 09:40 Der er 20 kommentarer og
1 løsning

Hjælp til gruppering måske filrering

Hej igen.

vil høre hvordan man laver en anden form for gruppering måske filrering ved ikke lige hvad der hedder.

wml fil:

kodeeksempel...
<supported_items>
<item>Motor 1</item>
<item>Motor 2</item>
<item>Motor 3</item>
<item>Motor 3</item>
<item>Motor 4</item>
<item>Motor 5</item>
<item>Motor 6</item>
<item>Motor 7</item>
<item>Motor2 1</item>
<item>Motor2 2</item>
<item>Motor2 3</item>
<item>Motor2 4</item>
<item>Motor2 5</item>
<item>Motor2 6</item>
</supported_items>


Hvordan laver jeg en gruppering på output bliver:
Motor : 1, 2, 3, 4, 5, 6, 7, Motor2 : 1, 2, 3, 4, 5, 6
Avatar billede softspot Forsker
04. august 2005 - 09:45 #1
Først og fremmest: opdel data i en lidt mere finmasket form

f.eks.

<supported_items>
  <item>
    <name>Motor</name>
    <index>1</index>
    <index>2</index>
    <index>3</index>
    <index>4</index>
    <index>5</index>
  </item>
  <item>
    <name>Motor2</name>
    <index>1</index>
    <index>2</index>
    <index>3</index>
    <index>4</index>
    <index>5</index>
  </item>
</supported_items>

så bliver det lettere at gruppere som du ønsker...
Avatar billede softspot Forsker
04. august 2005 - 09:46 #2
...men det afhænger lidt af hvad du skal bruge data til, for det kan jo godt være at en anden opdeling ville være mere nærliggende i dit specifikke tilfælde.
Avatar billede big_ossi Nybegynder
04. august 2005 - 09:56 #3
Wml em henter jeg fra en større firma.

og de lever dataen på den måde så den kan jeg ikke gøre meget til.

skal bruges på når man ser på en stk tilbehør så kommer der en liste med de items det virker til. men det ser lidt træls ud der står "motor" før hver type

Det står self ikke motor i wml men må ikke gengive data fra den.
Avatar billede big_ossi Nybegynder
04. august 2005 - 10:18 #4
Du har ikke et link eller noget til et sted hvor jeg kan blive klog på hvordan det gøres ?
Avatar billede softspot Forsker
04. august 2005 - 11:22 #5
Ikke umiddelbart.

Ved du hvilken del af hvert item der er produktet og hvilken del der er indeks (hvis man kan kalde det for indeks). Hvis du f.eks. ved at produktet er det der står indtil det første mellemrum, så kan du på rimelig overkommelig vis lave en rutine der kan håndtere den gruppering du efterspørger. Kan du entydigt definerer regelsættet for informationer i et item?
Avatar billede big_ossi Nybegynder
04. august 2005 - 11:51 #6
Okay. men det er det efter første mellemrum er det version nr. så det før det første mellemrum kan du godt kalde "index"

Hvad mener nu med "entydig definerer reglsættet" ?
Avatar billede softspot Forsker
04. august 2005 - 12:09 #7
Det du lige gjorde, nemlig at produktets navn er det der står indtil det første mellemrum :)

Prøv med dette uddrag af et xslt-script:

<xsl:template match="supported_items">
  <xsl:call-template name="listitems">
    <xsl:with-param name="productname" select="substring-before(item,' ')" />
  </xsl:call-template>
</xsl:template>

<xsl:template name="listitems">
  <xsl:param name="index" select="number(1)"/>
  <xsl:param name="productname" select="''"/>

  <xsl:variable name="current-item" select="item[$index]"/>

  <xsl:choose>
    <xsl:when test="$productname != substring-before($current-item,' ')">
      <xsl:value-of select="substring-before($current-item,' ')">:
      <xsl:value-of select="substring-before($current-item,' ')">
    </xsl:when>
    <xsl:otherwise>
      , <xsl:value-of select="substring-before($current-item,' ')">
    </xsl:otherwise>
  </xsl:choose>
  <xsl:if test="$index &lt; last()">
    <xsl:call-template name="listitems">
      <xsl:with-param name="index" select="$index+1"/>
      <xsl:with-param name="productname" select="substring-before($current-item,' ')"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>
Avatar billede big_ossi Nybegynder
04. august 2005 - 13:23 #8
den giver ikke lov tila t bruge det i den lykke jeg køre. siger template not allowd her"
Avatar billede softspot Forsker
04. august 2005 - 14:05 #9
hvor har du indsat disse templates?
Avatar billede big_ossi Nybegynder
04. august 2005 - 14:12 #10
Der hvor der står mobil dels start i stedet for at output supported_phones



<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" omit-xml-declaration="yes" indent="yes" />
<xsl:param name="PageSize"    select="4" />
<xsl:param name="Count"      select="count(*/content)"/>
<xsl:param name="CurrentPage" />
<xsl:param name="cat" />
<xsl:param name="con" />
<xsl:template match="*">
<br/>

<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border: 0px;">

        <xsl:for-each select="//content[GAMECATEGORY=$cat]">
        <xsl:sort select="@id" data-type="number" order="descending" />

<xsl:if test="position()>(($CurrentPage -1)*$PageSize) and position()&lt;=((($CurrentPage -1)*$PageSize)+$PageSize)">

  <tr>
    <td bgcolor="#D6D6A7" colspan="2"><strong><xsl:value-of select="GAMENAME" /></strong></td>
  </tr>
  <tr>
  <td><small>Bestillingskode:  <strong><xsl:value-of select="shortcode" /></strong></small></td>
  </tr>
  <tr bgcolor="#E6F2EA">
    <td bgcolor="#E6F2EA" width="100" rowspan="2">
    <!-- Billede 1 -->
    <img>
  <xsl:attribute name="src">
<xsl:value-of select="PICTURE_URL_a" />
  </xsl:attribute>
  <xsl:attribute name="border">
  <xsl:text>0</xsl:text>
  </xsl:attribute>
  <xsl:attribute name="alt">
  <xsl:text>image</xsl:text>
  </xsl:attribute></img><br/>
  <!-- Billede 2 -->
  <img>
  <xsl:attribute name="src">
<xsl:value-of select="PICTURE_URL_b" />
  </xsl:attribute>
  <xsl:attribute name="border">
  <xsl:text>0</xsl:text>
  </xsl:attribute>
  <xsl:attribute name="alt">
  <xsl:text>image</xsl:text>
  </xsl:attribute></img><br/>
  <!-- Billede 3 --> 
  <img>
  <xsl:attribute name="src">
  <xsl:value-of select="PICTURE_URL_c" />
  </xsl:attribute>
  <xsl:attribute name="border">
  <xsl:text>0</xsl:text>
  </xsl:attribute>
  <xsl:attribute name="alt">
  <xsl:text>image</xsl:text>
  </xsl:attribute></img></td>
    <td width="100%" bgcolor="#E6F2EA" valign="top"><small><xsl:value-of select="DESCRIPTION" /></small></td>
  </tr>
  <tr>
    <td valign="bottom" width="100%" bgcolor="#E6F2EA" colspan="2"><small>
    <!-- Virker på mobil del -->
    <xsl:value-of select="supported_phones" />
    <!-- slut virker på mobil del -->
    </small><br/></td>
  </tr>
  <tr><td height="20"></td>
  </tr>

        </xsl:if>

        </xsl:for-each>
     
</table>
     

     
<!-- PAGING START --> 
<xsl:call-template name="paging">
      <xsl:with-param name="Count" select="count(*/content[GAMECATEGORY=$cat])"/>
      <xsl:with-param name="Page" select="1"/>
      </xsl:call-template>
    <br />
</xsl:template>

<xsl:template name="paging">
<xsl:param name="Count"/>
<xsl:param name="Page"/>


<xsl:if test="$Page!=$CurrentPage">
<small><a href="?con={$con}&amp;tc=java&amp;page={$Page}&amp;cat={$cat}">
<xsl:value-of select="$Page"/>
</a></small>
</xsl:if>

<xsl:if test="$Page=$CurrentPage">
<strong><small>
<xsl:value-of select="$Page"/>
</small></strong>
</xsl:if>
<xsl:text> </xsl:text>

<xsl:if test="$Page &lt;= ($Count div $PageSize)">
    <xsl:call-template name="paging">
    <xsl:with-param name="Count" select="$Count"/>
    <xsl:with-param name="Page" select="$Page+1"/>
    </xsl:call-template>
</xsl:if>

</xsl:template>
<!-- PAGING END -->




  <xsl:template match="/">
    <xsl:apply-templates />
  </xsl:template>
</xsl:stylesheet>
Avatar billede big_ossi Nybegynder
04. august 2005 - 14:19 #11
ja det går nok uden det strider mod reglerne.

supported_items er = supported_phones i wml
iteme = phone
Avatar billede softspot Forsker
04. august 2005 - 15:10 #12
Jeg kan ikke få øje på den kode jeg postede, men det er måske fordi den ikke er indsat i den kode du postede...?
Avatar billede big_ossi Nybegynder
05. august 2005 - 14:44 #13
Her er koden med dit forslag i, som den ser ud når jeg tester på serveren.


<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" omit-xml-declaration="yes" indent="yes" />
<xsl:param name="PageSize"    select="4" />
<xsl:param name="Count"      select="count(*/content)"/>
<xsl:param name="CurrentPage" />
<xsl:param name="cat" />
<xsl:param name="con" />
<xsl:template match="*">
<br/>

<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border: 0px;">

        <xsl:for-each select="//content[GAMECATEGORY=$cat]">
        <xsl:sort select="@id" data-type="number" order="descending" />

<xsl:if test="position()>(($CurrentPage -1)*$PageSize) and position()&lt;=((($CurrentPage -1)*$PageSize)+$PageSize)">

  <tr>
    <td bgcolor="#D6D6A7" colspan="2"><strong><xsl:value-of select="GAMENAME" /></strong></td>
  </tr>
  <tr>
  <td><small>Bestillingskode:  <strong><xsl:value-of select="shortcode" /></strong></small></td>
  </tr>
  <tr bgcolor="#E6F2EA">
    <td bgcolor="#E6F2EA" width="100" rowspan="2">
    <!-- Billede 1 -->
    <img>
  <xsl:attribute name="src">
<xsl:value-of select="PICTURE_URL_a" />
  </xsl:attribute>
  <xsl:attribute name="border">
  <xsl:text>0</xsl:text>
  </xsl:attribute>
  <xsl:attribute name="alt">
  <xsl:text>image</xsl:text>
  </xsl:attribute></img><br/>
  <!-- Billede 2 -->
  <img>
  <xsl:attribute name="src">
<xsl:value-of select="PICTURE_URL_b" />
  </xsl:attribute>
  <xsl:attribute name="border">
  <xsl:text>0</xsl:text>
  </xsl:attribute>
  <xsl:attribute name="alt">
  <xsl:text>image</xsl:text>
  </xsl:attribute></img><br/>
  <!-- Billede 3 --> 
  <img>
  <xsl:attribute name="src">
  <xsl:value-of select="PICTURE_URL_c" />
  </xsl:attribute>
  <xsl:attribute name="border">
  <xsl:text>0</xsl:text>
  </xsl:attribute>
  <xsl:attribute name="alt">
  <xsl:text>image</xsl:text>
  </xsl:attribute></img></td>
    <td width="100%" bgcolor="#E6F2EA" valign="top"><small><xsl:value-of select="DESCRIPTION" /></small></td>
  </tr>
  <tr>
    <td valign="bottom" width="100%" bgcolor="#E6F2EA" colspan="2"><small>
 
    <!-- Koden fra exp -->
   
    <xsl:template match="supported_phones">
  <xsl:call-template name="listitems">
    <xsl:with-param name="productname" select="substring-before(item,' ')" />
  </xsl:call-template>
</xsl:template>

<xsl:template name="listitems">
  <xsl:param name="index" select="number(1)"/>
  <xsl:param name="productname" select="''"/>

  <xsl:variable name="current-item" select="phone[$index]"/>

  <xsl:choose>
    <xsl:when test="$productname != substring-before($current-item,' ')">
      <xsl:value-of select="substring-before($current-item,' ')">:
      <xsl:value-of select="substring-before($current-item,' ')">
    </xsl:when>
    <xsl:otherwise>
      , <xsl:value-of select="substring-before($current-item,' ')">
    </xsl:otherwise>
  </xsl:choose>
  <xsl:if test="$index &lt; last()">
    <xsl:call-template name="listitems">
      <xsl:with-param name="index" select="$index+1"/>
      <xsl:with-param name="productname" select="substring-before($current-item,' ')"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>
   
   
    <!-- slut på koden fra exp -->
   
    </small><br/></td>
  </tr>
  <tr><td height="20"></td>
  </tr>

        </xsl:if>

        </xsl:for-each>
     
</table>
     

     
<!-- PAGING START --> 
<xsl:call-template name="paging">
      <xsl:with-param name="Count" select="count(*/content[GAMECATEGORY=$cat])"/>
      <xsl:with-param name="Page" select="1"/>
      </xsl:call-template>
    <br />
</xsl:template>

<xsl:template name="paging">
<xsl:param name="Count"/>
<xsl:param name="Page"/>


<xsl:if test="$Page!=$CurrentPage">
<small><a href="?con={$con}&amp;tc=java&amp;page={$Page}&amp;cat={$cat}">
<xsl:value-of select="$Page"/>
</a></small>
</xsl:if>

<xsl:if test="$Page=$CurrentPage">
<strong><small>
<xsl:value-of select="$Page"/>
</small></strong>
</xsl:if>
<xsl:text> </xsl:text>

<xsl:if test="$Page &lt;= ($Count div $PageSize)">
    <xsl:call-template name="paging">
    <xsl:with-param name="Count" select="$Count"/>
    <xsl:with-param name="Page" select="$Page+1"/>
    </xsl:call-template>
</xsl:if>

</xsl:template>
<!-- PAGING END -->




  <xsl:template match="/">
    <xsl:apply-templates />
  </xsl:template>
</xsl:stylesheet>
Avatar billede softspot Forsker
05. august 2005 - 16:05 #14
Jeg havde den mistanke om at du ikke havde sat dem ind som rod-elementer, for xsl:template kan kun ligge umiddelbart under xsl:stylesheet. Det du skal gøre at at tage dem ud derfra hvor de ligger nu og placere dem f.eks. lige efter den allersidste </xsl:template>.

Du skal så kalde rutinen supported_phones ved at kalde xsl:apply-templates der hvor supported_phones skal indsættes. Vær opmærksom på at du skal være på den akse i XML-strukturen hvor supported_phones ligger...
Avatar billede big_ossi Nybegynder
08. august 2005 - 09:01 #15
Hej.

Den laver en fejl, "he stylesheet does not contain a document element. The stylesheet may be empty, or it may not be a well-formed XML document"

koden efter at heve rettet i den.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" omit-xml-declaration="yes" indent="yes" />
<xsl:param name="PageSize"    select="4" />
<xsl:param name="Count"      select="count(*/content)"/>
<xsl:param name="CurrentPage" />
<xsl:param name="cat" />
<xsl:param name="con" />
<xsl:template match="*">
<br/>

<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border: 0px;">

        <xsl:for-each select="//content[GAMECATEGORY=$cat]">
        <xsl:sort select="@id" data-type="number" order="descending" />

<xsl:if test="position()>(($CurrentPage -1)*$PageSize) and position()&lt;=((($CurrentPage -1)*$PageSize)+$PageSize)">

  <tr>
    <td bgcolor="#D6D6A7" colspan="2"><strong><xsl:value-of select="GAMENAME" /></strong></td>
  </tr>
  <tr>
  <td><small>Bestillingskode:  <strong><xsl:value-of select="shortcode" /></strong></small></td>
  </tr>
  <tr bgcolor="#E6F2EA">
    <td bgcolor="#E6F2EA" width="100" rowspan="2">
    <!-- Billede 1 -->
    <img>
  <xsl:attribute name="src">
<xsl:value-of select="PICTURE_URL_a" />
  </xsl:attribute>
  <xsl:attribute name="border">
  <xsl:text>0</xsl:text>
  </xsl:attribute>
  <xsl:attribute name="alt">
  <xsl:text>image</xsl:text>
  </xsl:attribute></img><br/>
  <!-- Billede 2 -->
  <img>
  <xsl:attribute name="src">
<xsl:value-of select="PICTURE_URL_b" />
  </xsl:attribute>
  <xsl:attribute name="border">
  <xsl:text>0</xsl:text>
  </xsl:attribute>
  <xsl:attribute name="alt">
  <xsl:text>image</xsl:text>
  </xsl:attribute></img><br/>
  <!-- Billede 3 -->
  <img>
  <xsl:attribute name="src">
  <xsl:value-of select="PICTURE_URL_c" />
  </xsl:attribute>
  <xsl:attribute name="border">
  <xsl:text>0</xsl:text>
  </xsl:attribute>
  <xsl:attribute name="alt">
  <xsl:text>image</xsl:text>
  </xsl:attribute></img></td>
    <td width="100%" bgcolor="#E6F2EA" valign="top"><small><xsl:value-of select="DESCRIPTION" /></small></td>
  </tr>
  <tr>
    <td valign="bottom" width="100%" bgcolor="#E6F2EA" colspan="2"><small>

    <!-- Koden fra exp - -->
 
    <xsl:apply-templates name="supported_phones">
 
 
  <!-- slut på koden fra exp -->
 
    </small><br/></td>
  </tr>
  <tr><td height="20"></td>
  </tr>

        </xsl:if>

        </xsl:for-each>
   
</table>
   

   
<!-- PAGING START -->
<xsl:call-template name="paging">
      <xsl:with-param name="Count" select="count(*/content[GAMECATEGORY=$cat])"/>
      <xsl:with-param name="Page" select="1"/>
      </xsl:call-template>
    <br />
</xsl:template>

<xsl:template name="paging">
<xsl:param name="Count"/>
<xsl:param name="Page"/>


<xsl:if test="$Page!=$CurrentPage">
<small><a href="?con={$con}&amp;tc=java&amp;page={$Page}&amp;cat={$cat}">
<xsl:value-of select="$Page"/>
</a></small>
</xsl:if>

<xsl:if test="$Page=$CurrentPage">
<strong><small>
<xsl:value-of select="$Page"/>
</small></strong>
</xsl:if>
<xsl:text> </xsl:text>

<xsl:if test="$Page &lt;= ($Count div $PageSize)">
    <xsl:call-template name="paging">
    <xsl:with-param name="Count" select="$Count"/>
    <xsl:with-param name="Page" select="$Page+1"/>
    </xsl:call-template>
</xsl:if>

</xsl:template>
<!-- PAGING END -->


  <xsl:template match="/">
    <xsl:apply-templates />
  </xsl:template>
  <!-- mobil cat -->
  <xsl:template match="supported_phones">
  <xsl:call-template name="listitems">
    <xsl:with-param name="productname" select="substring-before(item,' ')" />
  </xsl:call-template>
</xsl:template>

<xsl:template name="listitems">
  <xsl:param name="index" select="number(1)"/>
  <xsl:param name="productname" select="''"/>

  <xsl:variable name="current-item" select="phone[$index]"/>

  <xsl:choose>
    <xsl:when test="$productname != substring-before($current-item,' ')">
      <xsl:value-of select="substring-before($current-item,' ')">:
      <xsl:value-of select="substring-before($current-item,' ')">
    </xsl:when>
    <xsl:otherwise>
      , <xsl:value-of select="substring-before($current-item,' ')">
    </xsl:otherwise>
  </xsl:choose>
  <xsl:if test="$index &lt; last()">
    <xsl:call-template name="listitems">
      <xsl:with-param name="index" select="$index+1"/>
      <xsl:with-param name="productname" select="substring-before($current-item,' ')"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>



</xsl:stylesheet>
Avatar billede big_ossi Nybegynder
08. august 2005 - 09:16 #16
wml fil:

<Data>

<content id="614">
<GAMENAME>Air Hockey</GAMENAME>
<GAMECATEGORY>Arkade spil</GAMECATEGORY>
<PICTURE_URL_a>url</PICTURE_URL_a>
<PICTURE_URL_b>url</PICTURE_URL_b>
<PICTURE_URL_c>url</PICTURE_URL_c>
<JAD_URL>url</JAD_URL>
<JAR_URL></JAR_URL>
<HEADLINE>Air Hockey</HEADLINE>
<DESCRIPTION>en som i virkeligheden!</DESCRIPTION>
<supported_phones>
<phone>Motorola 1</phone>
<phone>Motorola 2</phone>
<phone>Motorola 3</phone>
</supported_phones>
<type>33</type>
<id>614</id>
<StrCode>14A</StrCode>
<shortcode>33614</shortcode>
</content>
Avatar billede softspot Forsker
08. august 2005 - 09:51 #17
Når du laver en kommando

<xsl:apply-templates name="supported_phones">

så skal du huske at lukke tagget igen. I øvrigt hedder det

<xsl:apply-templates select="supported_phones" />

Håber det bringer dig videre... :)
Avatar billede big_ossi Nybegynder
15. august 2005 - 15:31 #18
Neej det vil ikke så har droppet det og lader det være som der er nu hvor den skriver mobil mærke foran hver model.
Avatar billede softspot Forsker
15. august 2005 - 16:37 #19
Så smid et svar selv og giv dig selv point, således spørgsmålet bliver lukket :)
Avatar billede big_ossi Nybegynder
15. august 2005 - 22:33 #20
Svar.

Mange tak for din hjælp, Det lidt trist det ikke ville virke for mig.

Men du må gerne få points for dine forsøg, for det har da hjulpet på min forståelse af xsl ;)
Avatar billede softspot Forsker
16. august 2005 - 00:12 #21
Hvilken kontekst er det dette XSL kører i, for der er nogle parametre som muligvis gør det svært for mig at teste (har ikke lige gennemskuet hvor omfattende betydning parametrene har).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester