[XSL] Attribute van een parent achterhalen

Pagina: 1
Acties:

  • Barracuda_82
  • Registratie: September 2001
  • Laatst online: 19-12-2024

Barracuda_82

mkTime(), not war!

Topicstarter
Ik heb een XML waarvan sommige nodes een attribute "color" hebben. Deze attribute slaat op een kleur die dmv CSS weergegeven wordt (color1, color2, etc).

Nu moeten alle childs van een node die een attribute "color" hebben ook een style krijgen (color1_indent, color2_indent, etc.). Ik krijg het wel voor elkaar om te achterhalen of een parent een bepaalde attribute heeft, maar niet of een van de parents deze attribute heeft.

Dit is een voorbeeld van wat ik probeer te realiseren.
Afbeeldingslocatie: http://img58.imageshack.us/img58/7287/voorbeeld2yq.jpg

In dit voorbeeld is er maar 1 level diepte, maar dit kan natuurlijk ondeindig zijn.

Heeft iemand enig idee hoe ik kan achterhalen of er een parent is met deze attribute?

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 06-02 11:38

BHR

Via de ancestor axis.
code:
1
2
3
4
5
<td>
  <xsl:attribute name="class">
    <xsl:value-of select="ancestor::*[@color][1]/@color"/><xsl:text>_indent</xsl:text>
  </xsl:attribute>
</td>


zie ook: http://www.w3schools.com/xpath/xpath_axes.asp

[ Voor 31% gewijzigd door BHR op 28-06-2006 17:17 ]

No amount of key presses will shut off the Random Bug Generator


  • Barracuda_82
  • Registratie: September 2001
  • Laatst online: 19-12-2024

Barracuda_82

mkTime(), not war!

Topicstarter
BHR schreef op woensdag 28 juni 2006 @ 17:11:
Via de ancestor axis.
code:
1
2
3
4
5
<td>
  <xsl:attribute name="class">
    <xsl:value-of select="ancestor::*[@color][1]/@color"/><xsl:text>_indent</xsl:text>
  </xsl:attribute>
</td>
Dit werkt alleen voor 1 level, en niet voor meerdere levels.

Kijk:
Afbeeldingslocatie: http://img273.imageshack.us/img273/3845/kleuren6ct.jpg

In dit voorbeeld heeft "top level" een kleur (1) en de childs krijgen netjes deze attribute, maar de twee childs van een van die childs niet. Deze zouden ook 1 moeten krijgen.

<xsl:value-of select="ancestor::*[@color][1]/@color"/><xsl:text>_indent</xsl:text>

In deze regel staat 1 voor de level, maar dat zou oneindig moeten zijn.

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 06-02 11:38

BHR

De 1 staat voor 'selecteer van child naar root de eerste node die een @color attribuut heeft'.

Wellicht kun je wat meer xsl code geven, om aan te geven hoe je je nodes bijlangsgaat op de html te bouwen?

No amount of key presses will shut off the Random Bug Generator


  • Barracuda_82
  • Registratie: September 2001
  • Laatst online: 19-12-2024

Barracuda_82

mkTime(), not war!

Topicstarter
BHR schreef op woensdag 28 juni 2006 @ 17:24:
De 1 staat voor 'selecteer van child naar root de eerste node die een @color attribuut heeft'.

Wellicht kun je wat meer xsl code geven, om aan te geven hoe je je nodes bijlangsgaat op de html te bouwen?
Dit is de XSL op dit moment:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<xsl:template match="group"> 
        <xsl:variable name="node_depth" select="count(ancestor::node())" />
        <xsl:variable name="user_count" select="count(descendant::user)" />
    
        
        <tr class="workgroup_row color{parent::group/@color}_indent">
            <td style="padding-left: {($node_depth * 20) - 34}px;">
                <a href="?viewGroup={@id}"><xsl:value-of select="@name" /></a>
                Kleur: <xsl:value-of select="ancestor::*[@color][1]/@color"/>
            </td>
            <td>
                <xsl:value-of select="$user_count"/>
            </td>
            <td>
                <a href="">[img]"/demo/beheer/site_files/img/edit.gif"[/img]</a>
                <a href="">[img]"/demo/beheer/site_files/img/tresj.gif"[/img]</a>
            </td>
        </tr>
        <xsl:apply-templates select="group" />
    </xsl:template>

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 06-02 11:38

BHR

Wil je ook een stukje van je xml posten? Ik vermoed dat er ook <group color=""> elementen zijn..., met wat xml kan ik je iig beter helpen :)

Mijn testcase:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<group name="a1" color="yellow">
    <group name="b1" color="blue">
        <group name="c1">
            <group name="d1" color="red">
                <group name="e1"/>
            </group>
            <group name="d2">
                <group name="e2">
                    <group name="f1"/>
                </group>
            </group>
        </group>
    </group>
    <group name="b2">
        <group name="c2" color="green">
            <group name="d3" color="purple"/>
        </group>
    </group>
    <group name="b3"/>
</group>


XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match="/">
        <table border="1" cellpadding="2">
            <xsl:apply-templates select="group"/>
        </table>
    </xsl:template>
    <xsl:template match="group">
        <xsl:variable name="node_depth" select="count(ancestor::node())"/>
        <xsl:variable name="user_count" select="count(descendant::group)"/>
        <tr>
            <td><xsl:value-of select="@name"/></td>
            <td><xsl:value-of select="$node_depth"/></td>
            <td><xsl:value-of select="$user_count"/></td>
            <td><xsl:value-of select="parent::group/@color"/></td>
            <td><xsl:value-of select="ancestor::*[@color][1]/@color"/></td>
        </tr>
        <xsl:apply-templates select="group"/>
    </xsl:template>
</xsl:stylesheet>


Resultaat:
a1111
b126yellowyellow
c135blueblue
d141blue
e150redred
d242blue
e251blue
f160blue
b222yellowyellow
c231yellow
d340greengreen
b320yellowyellow

[ Voor 117% gewijzigd door BHR op 28-06-2006 20:39 ]

No amount of key presses will shut off the Random Bug Generator


  • Barracuda_82
  • Registratie: September 2001
  • Laatst online: 19-12-2024

Barracuda_82

mkTime(), not war!

Topicstarter
Zo ziet de XML er uit (bovenstaande werkt helaas ook niet):

Afbeeldingslocatie: http://img230.imageshack.us/img230/9844/groups4qw.jpg

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 17:47

RM-rf

1 2 3 4 5 7 6 8 9

Barracuda_82 schreef op woensdag 28 juni 2006 @ 17:36:
[...]


Dit is de XSL op dit moment:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<xsl:template match="group"> 
        <xsl:variable name="node_depth" select="count(ancestor::node())" />
        <xsl:variable name="user_count" select="count(descendant::user)" />
    
        
        <tr class="workgroup_row color{parent::group/@color}_indent">
            <td style="padding-left: {($node_depth * 20) - 34}px;">
                <a href="?viewGroup={@id}"><xsl:value-of select="@name" /></a>
                Kleur: <xsl:value-of select="ancestor::*[@color][1]/@color"/>
            </td>
            <td>
                <xsl:value-of select="$user_count"/>
            </td>
            <td>
                <a href=""><img src="/demo/beheer/site_files/img/edit.gif" border="0" hspace="8" /></a>
                <a href=""><img src="/demo/beheer/site_files/img/tresj.gif" border="0" /></a>
            </td>
        </tr>
        <xsl:apply-templates select="group" />
    </xsl:template>
Om eerlijk te zijn: ik zou denken dat de fout hier vooral ligt bij het gebruik van een tabel, voor een informatie die eigenlijk in een nested List kan worden gevat ....
Dat zou direkt het probleem oplossen van de color om de parent, omdat dat perfect via CSS te doen zou zijn:

HTML:
1
2
3
4
5
6
7
<ul>
   <li class="color"> Group 
       <ul>
              <li> SubGroup </li>
       </ul>
    </li>
</ul>

dit heeft ook als voordeel dat het veel beter overeenkomt met de structuur van je XML (met nested nodes) waardoor je XSL veel consequenter kan zijn en je niet layoutbeschrijvende informatie door je XSL moet laten genereren (bv die padding-left)

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


  • Barracuda_82
  • Registratie: September 2001
  • Laatst online: 19-12-2024

Barracuda_82

mkTime(), not war!

Topicstarter
RM-rf schreef op donderdag 29 juni 2006 @ 09:53:
[...]


Om eerlijk te zijn: ik zou denken dat de fout hier vooral ligt bij het gebruik van een tabel, voor een informatie die eigenlijk in een nested List kan worden gevat ....
Dat zou direkt het probleem oplossen van de color om de parent, omdat dat perfect via CSS te doen zou zijn:

HTML:
1
2
3
4
5
6
7
<ul>
   <li class="color"> Group 
       <ul>
              <li> SubGroup </li>
       </ul>
    </li>
</ul>

dit heeft ook als voordeel dat het veel beter overeenkomt met de structuur van je XML (met nested nodes) waardoor je XSL veel consequenter kan zijn en je niet layoutbeschrijvende informatie door je XSL moet laten genereren (bv die padding-left)
Je hebt helemaal gelijk, en dit was ook het eerste wat ik geprobeerd heb, maar het is erg moeilijk om het ontwerp na te bouwen met alleen lists. Ik ben vrij bedreven in CSS, maar dit is iets wat ik niet voor elkaar krijg. Misschien kan ik het dadelijk nog een keer proberen (nieuwe dag, frisse blik enzo).

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 06-02 11:38

BHR

Wil je ook een stukje van je xml posten? Ik vermoed dat er ook <group color=""> elementen zijn..., met wat xml kan ik je iig beter helpen :)
Vervolgens staan die iid in je xml....


Verander de:
XML:
1
<xsl:value-of select="ancestor::*[@color][1]/@color"/>


naar:
XML:
1
<xsl:value-of select="ancestor::*[@color != ''][1]/@color"/>

No amount of key presses will shut off the Random Bug Generator


  • Barracuda_82
  • Registratie: September 2001
  • Laatst online: 19-12-2024

Barracuda_82

mkTime(), not war!

Topicstarter
BHR schreef op donderdag 29 juni 2006 @ 12:32:
[...]


Vervolgens staan die iid in je xml....


Verander de:
XML:
1
<xsl:value-of select="ancestor::*[@color][1]/@color"/>


naar:
XML:
1
<xsl:value-of select="ancestor::*[@color != ''][1]/@color"/>
Nope... ook dit werkt niet. Ik heb inmiddels ook al veel verschillende dingen geprobeerd, maar ik krijg het echt niet voor elkaar. Ook alles in een list zetten krijg ik niet netjes. :/

Zo is ie nu met bovenstaande aanpassing:
http://img231.imageshack.us/img231/9088/voorbeeld0av.jpg

Edit:
Ik heb hem!!! Woei!

Afbeeldingslocatie: http://img114.imageshack.us/img114/8329/voorbeeld21wz.jpg

code:
1
Kleur: <xsl:value-of select="ancestor::*[@color != '']/@color"/>


@BHR: Thnx voor de hulp!

[ Voor 26% gewijzigd door Barracuda_82 op 29-06-2006 15:39 ]

Pagina: 1