ugrás a tartalomhoz

XSLT: csak az aktuális elem kiválasztása

waff · 2006. Szep. 19. (K), 10.31
Üdvözlet!

Lenne egy amatőr kérdésem, sajnos nem tudtam rájönni a megoldásra:
<c><h>...</h></c>
<c><l>...</l></c>
<c><h><a>..</a></h></c>
<c><l>..</l></c>
xsl:
<body>
<div id="main">
<xsl:for-each select="./c/">
<xsl:value-of select="."/>
</xsl:for-each>
</div>
</body>
<xsl:template match="//h">...
<xsl:template match="//a">...
<xsl:template match="//l">...
szoval van az xml-em, amiben vannak a <c>-k(legyenek komponensek) a c-ken belul lehet pl. <l> vagy <h> vagy akarmi mas, lenyeg, hogy kulonbozo tipusu entitasokat reprezentalnak.
az l-be peldaul menupontok tulajdonsagait tarolom(url, kep, flash, akarmi).
azt szeretnem az xsl-el, hogy ebbol legeneralom a menupontokat, meg ami meg kell.
az a problemam, hogy ha eler a feldolgozo az elso <l>-hez, akkor nem csak ennek az l-nek az elemeit jeleniti meg, hanem az osszes utana kovetkezojet is. es amikor eler a kovetkezohoz, akkor megint az osszeset.
nekem az kellene,hogy csak az aktualisat dolgozza fel.
remelem igy ertheto.
a <c>-ket is csak azert tettem bele, hogy hatha for-al menni fog, de sajna ugy se sikerult :(

elore is koszonom a segitseget!
 
1

mi a kérdés?

Hojtsy Gábor · 2006. Szep. 19. (K), 11.41
Azt akarod, hogy az aktuális <c>-ken belül lévő <l>-eket dolgozza fel együtt, aztán a következő <c>-ben lévő <l>-eket, és így tovább? Akkor kell legyen aktuális <c>, tehát a <c>-n belül kellene kiválasztani megjelenítésre az <l>-eket. Nem tudnál esetleg egy értelmesebb elemneveket, és lecsupaszított példát mutatni (ha már a <c> csak valami nem feltétlen szükséges technikai ok miatt került be)? Így nem eléggé világos neked, hogy miben tudnék segíteni.
2

xml

waff · 2006. Szep. 19. (K), 11.57
<component>
<header style="header">
<hc src="head_bal.jpg" width="220" height="97" title="Logo" />
<hc src="head_kozep.jpg" width="203" height="97" title="Belepes" />
<hc src="head_jobb.jpg" width="317" height="97" title="vmi" />
</header>
</component>
<component>
<lister style="fomenu">
<link title="xx" url="50" target="n">
<img1 src="button1.gif" width="93" />
</link>
<link title="ugyfelek" url="51" target="n">
<img1 src="button2.gif" width="93" />
</link>
<link title="Portfolia" url="52" target="n">
<img1 src="button3.gif" width="93" />
</link>
</lister>
</component>
<component>
<cikk type=" ai" src="street.jpg" w1="423" w2="317" >
<div class="cikk">cikk szovege</div>
</cikk>
</component>
<component>
<lister extrastyle="felso_menu">
<link title="egy" url="47" target="n">
</link>
<link title="ket" url="49" target="n">
</link>
</lister>
</component>
ez az xml.
a mostani verzioban amikor a feldolgozas eler az elso <lister>-hez, akkor nem csak az abban levo linkek kerulnek kiirasra, hanem az osszes lister linkjei. es amikor a masodikhoz er, akkor ugyanugy kiirja az elsojet is(tehat megint az osszeset).
az lenne a kerdes, hogy hogyan tudnam azt megoldani, hogy a fenti sorrendet megtartva, mindig csak az aktualis componenten beluli elemeket dolgozza fel.

koszi, waff
3

Fura...

vbence · 2006. Szep. 19. (K), 13.14
A Value-of itt ugyebár teljesen üres stringeket ad vissza, mivel a leírt XML-ben egyáltalán nincs szöveg.

Ha az első példához ragaszkodunk, akkor value-of select="l" ell neked, ha csak az aktuális elem l nevű gyerekére szeretnéd a value-of -ot vonatkoztatni.
4

rossz a kerdes?

waff · 2006. Szep. 19. (K), 13.29
de megjelnik minden frankon, kep, flash, link, csak az a baj, hogy tobbszor.
tehat:
<component>
<lister>
<link title="egy"/>
<link title="ket"/>
</lister>
</component>
<component>
<header ... />
</component>
<component>
<lister>
<link title="harom"/>
<link title="negy"/>
</lister>
</component>
ekkor a feldolgozas utan azt kapom, hogy egy ket harom negy + ami a headerben van + egy ket harom negy.

ehelyett azt szeretnem: egy ket + header + harom negy.
a kerdes, hogy ezt hogyan tudom megcsinalni?
5

két illesztés

Hojtsy Gábor · 2006. Szep. 19. (K), 13.44
Az XSLT magától is továbbmegy a gyermekek felé, ha nem zárod le az útját (pl. value-of select használatával). Tehát neked már nem kell megadni, hogy menjen rajtuk végig. Csinálj egy üres template-et valami ilyesmivel. A gyökérből magától elindul az XSLT, és előbb-utóbb eljut a header és a link elemekhez. Ezekhez a megfelelő sablont le fogja futtatni, a többihez nincs sablon, ezért azokban a szöveges tartalmat jeleníti meg, ha van ilyen (bár ahogy látom, te attribútumokkal dolgozol, ezért nem lesz más szöveges tartalom). Ki kell tehát írnia, hogy egy ket header harom negy. Bár nem próbáltam, ennyi elég kell legyen ehhez az alapkérdéshez.
<xsl:template match="header">
  <xsl:text>header </xsl:text>
</xsl:template>

<xsl:template match="link">
  <xsl:value-of select="@title" />
  <xsl:text> </xsl:text>
</xsl:template>
6

ehh

waff · 2006. Szep. 19. (K), 14.00
koszi szepen, valoban ez a megoldas, nem kell a / a template-match-ba :)
ugy latszik tanulmanyoznom kell az xpath-ot...
koszi megegyszer a segitseget!