๐Ÿš€ go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

2 total messages Started by Adam Fri, 25 Jan 2008 13:56
Poczatkujacy w XSLT
#9649
Author: Adam
Date: Fri, 25 Jan 2008 13:56
84 lines
3714 bytes
Witam.

To moje poczatki z XSLT i napotkalem na problem. Chetnie poznalbym rozwiazanie
mojego problemu a oto on. Mam taki zrodlowy plik XML definiujacy strukture menu:

<menu>
        <item name="0">
                <label>Item 0</label>
        </item>
        <item name="1">
                <label>Item 1</label>
                <item name="1">
                        <label>Subitem 1</label>
                </item>
                <item name="2">
                        <label>Subitem 2</label>
                        <item name="1">
                                <label>Subsubitem 1</label>
                        </item>
                        <item name="2">
                                <label>Subsubitem 2</label>
                        </item>
                </item>
                <item name="3">
                        <label>Subitem 3</label>
                </item>
                <item name="4">
                        <label>Subitem 4</label>
                </item>
        </item>
        <item name="2">
                <label>Item 2</label>
                <item name="1">
                        <label>Subitem 1</label>
                </item>
                <item name="2">
                    <label>Subitem 2</label>
                </item>
                <item name="3">
                    <label>Subitem 3</label>
                </item>
        </item>
        <item name="3">
                <label>Item 3</label>
        </item>
</menu>

Probuje utworzyc XSLT ktory z tego XML wygeneruje nastepujacy kod HTML (XSLT
otrzymuje na wejsciu parameter path okreslajacy sciezke do wybranego elementu).
Czyli jesli input path jest rowne 1.2.1 (okreslone przez parametry @name
kolejnych elementow <item>) to HTML bedzie nastepujacy

<div id="item">
        <div>Item 0</div>
        <div id="on_path">Item 1</div>
        <div id="indentedlevel">
                <div>Subitem 1</div>
                <div id="on_path">Subitem 2</div>
        </div>
        <div id="secondindentedlevel">
                <div id="selected">Subsubitem 1</div>
                <div>Subsubitem 2</div>
        </div>
        <div id="indentedlevel">
                <div>Subitem 3</div>
                <div>Subitem 4</div>
        </div>
        <div>Item 2</div>
        <div>Item 3</div>
</menu>

Napisalem XSL ktory tworzy podany HTML ale przy wchodzeniu w trzeci poziom
(secondindentedlevel) nie zamyka poziomu drugiego. Problem z tym jest taki, ze
przy wejsciu w trzeci poziom <div id="secondindentedlevel"> trzeba najpierw
zamknac poziom drugi (indentedlevel) tagiem </div>, a po wyjsciu z niego
ponownie go otworzyc. Bede wdzieczny za wszelkie sugestie.

Pozdrawiam
Adam



-- 
Wysล‚ano z serwisu OnetNiusy: http://niusy.onet.pl
Re: Poczatkujacy w XSLT
#9650
Author: NotBear
Date: Sat, 26 Jan 2008 10:05
51 lines
2635 bytes
Adam wrote:
> Probuje utworzyc XSLT ktory z tego XML wygeneruje nastepujacy kod
> HTML (XSLT otrzymuje na wejsciu parameter path okreslajacy sciezke do
> wybranego elementu). Czyli jesli input path jest rowne 1.2.1
> (okreslone przez parametry @name kolejnych elementow <item>) to HTML
> bedzie nastepujacy
> 
> <div id="item"> <div>Item 0</div>

[OT] Dygresja 1. Tworzysz pozagniezdzane listy, wiec uzyj elementow listy

<ul>
   <li>...

> <div id="on_path">Item 1</div> <div id="indentedlevel"> <div>Subitem
> 1</div> <div id="on_path">Subitem 2</div> </div>

[OT] Dygresja 2. Grubszy blad. Id sluzy do oznaczenia jednego, 
konkretnego elementu. "Jest w sciezce" to pewna wlasciwosc jednego lub 
wielu elementow. Innymi slowy - okresla przynaleznosc do _klasy_ 
elementow sciezki. Podobnie z "intendedlevel". Co wiecej - jesli zamiast 
tworzyc plaska strukture, pozagniezdzasz poziomy w sobie, to glebokosc 
bedzie wynikac z kontekstu i dodatkowe klasy numerujace poziomy nie beda 
potrzebne. Np:
<ul>
   <li class="in_path">
     <ul>
       <li class="in_path selected">...


> Problem z tym jest taki, ze przy wejsciu w trzeci poziom <div
> id="secondindentedlevel"> trzeba najpierw zamknac poziom drugi
> (indentedlevel) tagiem </div>, a po wyjsciu z niego ponownie go
> otworzyc. 

Nie pokazales najwazniejszego, czyli kodu transformacji. Ale trudno, 
podrzuce (zaznaczam, ze uproszczona) sugestie:

<xsl:template math="item">
   <li> <!-- otwieramy -->
     <xsl:value-of select="label"/>
     <ul>
       <xsl:apply-templates select="item"/> <!-- glebiej -->
     </ul>
   <li> <!-- zamykamy -->
<xsl:template>



-- 
NotBear
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads