[XML/XSL] Formatting problems..

Pagina: 1
Acties:

  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Ik heb hier toch elke keer weer problemen mee, ik zit al 2 dagen op dit probleem te tuuren en kom er echt niet meer uit.

Om jullie mijn mega grote xml file te besparen heb ik een demo xml file nagemaakt in het klein, met test data.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<Root>
    <Item>
        <ItemName>item 1</ItemName>
        <SubItem>
            <SubItemName>sub item 1</SubItemName>
        </SubItem>
        <SubItem>
            <SubItemName>sub item 2</SubItemName>
        </SubItem>
    </Item>
    <Item>
        <ItemName>item 2</ItemName>
        <SubItem>
            <SubItemName>sub item 1</SubItemName>
        </SubItem>
        <SubItem>
            <SubItemName>sub item 2</SubItemName>
        </SubItem>
    </Item>
</Root>


Dit moet het gaan worden in html, lijkt erg simpel maar of ik zie iets super stoms over het hoofd of het kan echt niet..

code:
1
2
3
4
5
6
7
8
9
10
11
12
<table border="1">
    <tr>
        <td>Item:</td>
        <td>item 1</td>
        <td>item 2</td>
    </tr>
    <tr>
        <td>SubItem:</td>
        <td>sub item 1<br>sub item 2</td>
        <td>sub item 1<br>sub item 2</td>
    </tr>
</table>


Ik krijg er van alles uit behalve wat ik wil..

Alvast erg bedankt voor die gene die me wil helpen..

weinig tot niks..


  • party42
  • Registratie: Oktober 2000
  • Laatst online: 14:19
ik neem aan dat je xml zo is:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<Root>
    <Item>
        <ItemName>item 1</ItemName>
        <SubItem>
            <SubItemName>item 1</SubItemName>
        </SubItem>
        <SubItem>
            <SubItemName>item 2</SubItemName>
        </SubItem>
    </Item>
    <Item>
        <ItemName>item 2</ItemName>
        <SubItem>
            <SubItemName>sub item 1</SubItemName>
        </SubItem>
        <SubItem>
            <SubItemName>sub item 2</SubItemName>
        </SubItem>
    </Item>
</Root>


dus:
- <root> = <table>
- <item> = <tr>
- <itemname> = <td>
- <subitem> = <td>

beetje apart dat je een dubbele definitie hebt van het <td> atribuut maargoed...

Welke code heb je tot nu toe staan? Volgens mij moet je met wat simpele for loopjes toch makkelijk tot een goede structuur kunnen komen? (getElementsByTagName)...

[offtopic]
ik zou overigens sneller kiezen voor het gebruiken van attribuut gestuurde xml in plaats van element gestuurde... dus:
code:
1
2
3
4
5
6
7
<Root>
    <Item>
        <ItemName id="item 1">
                  <SubItem Name="sub item 1"/>
                                </ItemName>
    </Item>
</Root>


etc... maar da's persoonlijk...

[ Voor 34% gewijzigd door party42 op 25-11-2003 12:59 ]

Everyday's an endless stream, of cigarettes and magazines...


  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Tot nu toe heb ik dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?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"/>

    <xsl:template match="Root">
        <table border="1">
            <tr>
                <td>Item:</td>
                <xsl:apply-templates select="Item"/>
            </tr>
            <tr>
                <td>SubItem:</td>
                <td>
                    <xsl:apply-templates select="Item/SubItem"/>
                </td>
            </tr>
        </table>
    </xsl:template>

    <xsl:template match="Item">
        <td>
            <xsl:apply-templates select="ItemName"/>
        </td>
    </xsl:template>

    <xsl:template match="ItemName">
        <xsl:value-of select="."/>
    </xsl:template>

    <xsl:template match="Item/SubItem">
        <xsl:apply-templates select="SubItemName"/>
    </xsl:template>

    <xsl:template match="SubItemName">
        <xsl:value-of select="."/><br/>
    </xsl:template>

</xsl:stylesheet>

weinig tot niks..


  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
party42 schreef op 25 november 2003 @ 12:55:
dus:
- <root> = <table>
- <item> = <tr>
- <itemname> = <td>
- <subitem> = <td>

beetje apart dat je een dubbele definitie hebt van het <td> atribuut maargoed...

Welke code heb je tot nu toe staan? Volgens mij moet je met wat simpele for loopjes toch makkelijk tot een goede structuur kunnen komen? (getElementsByTagName)...
Ik heb dat zo omdat sub items varaible is, het kunnen er ook 4 zijn of 6, is er een betere manier om dit te doen?

weinig tot niks..


  • party42
  • Registratie: Oktober 2000
  • Laatst online: 14:19
(sorry, ik was nog aan het editen... :) )

Everyday's an endless stream, of cigarettes and magazines...


  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
party42 schreef op 25 november 2003 @ 12:55:
[offtopic]
ik zou overigens sneller kiezen voor het gebruiken van attribuut gestuurde xml in plaats van element gestuurde... dus:
code:
1
2
3
4
5
6
7
<Root>
    <Item>
        <ItemName id="item 1">
                  <SubItem Name="sub item 1"/>
                                </ItemName>
    </Item>
</Root>


etc... maar da's persoonlijk...
Klopt, heb ik ook liever, maar de xml wordt gemaakt door een asp.net webservice, met de DataRelation class, ik heb nog niet kunnen uitvissen hoe de DataRelation de xml zo kan outputten.

Dat is de reden waarom het nu nog zo is zoals het is.

weinig tot niks..


  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
Het probleem zit hem dus in regel 14 (zie mijn xsl code in post 3):

<xsl:apply-templates select="Item/SubItem"/>

Die runt dus alle 4 de subitems, en niet de 2 sub items die bij de item horen.

weinig tot niks..


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Je hebt nu één td voor alle SubItems, terwijl je een aparte wilt per Item. Je moet dus opnieuw op Item selecteren, waardoor je hiervoor twee templates krijgt. Om dit op te lossen kun je gebruik maken van modes. Dan krijg je zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    <xsl:template match="Root">
        <table border="1">
            <tr>
                <td>Item:</td>
                <xsl:apply-templates select="Item" mode="normal"/>
            </tr>
            <tr>
                <td>SubItem:</td>
                <xsl:apply-templates select="Item" mode="sub"/>
            </tr>
        </table>
    </xsl:template>
    ...
    <xsl:template match="Item" mode="normal">
        <td>
            <xsl:apply-templates select="ItemName"/>
        </td>
    </xsl:template>
    ...
    <xsl:template match="Item" mode="sub">
        <td>
            <xsl:apply-templates select="SubItem/SubItemName"/>
        </td>
    </xsl:template>

Je kunt zelf vast wel betere namen bedenken dan 'normal' en 'sub' ;)

  • didio
  • Registratie: Maart 2001
  • Laatst online: 01-04 09:19

didio

didio.nl

Topicstarter
marcusk schreef op 25 november 2003 @ 13:17:
Je hebt nu één td voor alle SubItems, terwijl je een aparte wilt per Item. Je moet dus opnieuw op Item selecteren, waardoor je hiervoor twee templates krijgt. Om dit op te lossen kun je gebruik maken van modes. Dan krijg je zoiets:


Je kunt zelf vast wel betere namen bedenken dan 'normal' en 'sub' ;)
marcusk, mag ik jouw erg hartelijk bedanken, ik heb weer wat geleerd, ik had nog nooit van modes gehoord maar het werkt perfect..

[ Voor 49% gewijzigd door didio op 25-11-2003 13:24 ]

weinig tot niks..

Pagina: 1