[XSL]Data in html atribuut plaatsen

Pagina: 1
Acties:

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik ben bezig met leren een website te maken mbv. XML en XSL. Nu is het een en ander al aardig gelukt, maar ik ben nu wel op een probleem gestuit waar ik even niet verder mee kan. Wat ik probeer te/wil doen is dit:

code:
1
<a href="<xsl:value-of select="url"/>"><xsl:value-of select="text"/></a>


Dit werkt niet, ik krijg een error dat het < teken niet is toegestaan in een attribuut. Logisch, maar ik zou het toch wel op een of andere manier werkend willen krijgen. Wat is de methode om problemen als deze op te lossen met XSL(T)?

Noushka's Magnificent Dream | Unity


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

code:
1
<a><xsl:attribute name="href"><xsl:value-of select="url"/></xsl:attribute><xsl:value-of select="text"/></a>

[ Voor 41% gewijzigd door DeverauX op 03-12-2003 15:26 ]

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Bedankt voor de snelle reactie. Precies wat ik nodig had.

Noushka's Magnificent Dream | Unity


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
je kunt ook de {} gebruiken ipv value-of (attribute value templates)

code:
1
<a href="{href}"><xsl:value-of select="text"/></a>

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Werkt dat ook bij meerdere atributen? Dus dat je die value-of tags dan in de zelfde volgorde zet als de atributen?

Noushka's Magnificent Dream | Unity


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Michali schreef op 03 december 2003 @ 18:47:
Werkt dat ook bij meerdere atributen? Dus dat je die value-of tags dan in de zelfde volgorde zet als de atributen?
wat bedoel je precies?

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
code:
1
2
3
4
<a href="{href}" id="{id}">
<xsl:value-of select="text"/>
<xsl:value-of select="link_id"/>
</a>


Zoiets?

Noushka's Magnificent Dream | Unity


  • deviltje
  • Registratie: Juli 2000
  • Niet online
Michali schreef op 04 december 2003 @ 12:34:
code:
1
2
3
4
<a href="{href}" id="{id}">
<xsl:value-of select="text"/>
<xsl:value-of select="link_id"/>
</a>


Zoiets?
de href & id worden nu al neergezet... die hoef je niet nog een keer te selecteren..
dus dit zou worden
code:
1
2
3
<a href="{href}" id="{id}">
  <xsl:value-of select="text"/>
</a>

Iedereen die in telekinese gelooft, steek a.u.b. mijn hand op


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ja, maar wat me opvalt is dat je source node echt verdraaid veel lijkt op je output node. in sommige gevallen is het dan de moeite waard om te kijken of je je source node niet gewoon identiek kan maken aan je destination, en <xsl:copy-of /> te gebruiken. is veel sneller en overzichtelijker. maar goed dat hangt wel een beetje van je bron-xml af. maar zoals ik het nu bekijk, is je source node ongeveer zoiets:

XML:
1
2
3
4
5
<link>
    <id>1</id>
    <href>blaat.html</href>
    link naar blaat
</link>


die je omtovert naar een html anchor. als dat nou de enige transformatie is die je altijd op <link> elementen doet, waarom dan niet gewoon:

XML:
1
2
3
<foo>
    <a id="1" href="blaat.html">link naar blaat</a>
</foo>


met als XSL:

code:
1
2
3
<xsl:template match="/foo">
    <xsl:copy-of select="a" />
</xsl:template>

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Nou, ik gebruik dit om een menu op te bouwen. En een menu item kan ook een submenu bevatten dus kan ik hem niet hetzelfde maken als de html tag. Ik dacht even verkeerd bij die atributen, ik zie nu hoe het moet.

Noushka's Magnificent Dream | Unity


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Michali schreef op 05 december 2003 @ 11:59:
Nou, ik gebruik dit om een menu op te bouwen. En een menu item kan ook een submenu bevatten dus kan ik hem niet hetzelfde maken als de html tag. Ik dacht even verkeerd bij die atributen, ik zie nu hoe het moet.
je kunt ook gewoon attribute sets kopieren hoor:

XML:
1
2
3
<foo>
    <bar id="1" href="blaat.html">linkje</bar>
</foo>


XSLT:
1
2
3
4
5
6
    <xsl:template match="//bar">
        <a>
            <xsl:copy-of select="@*" />
            <xsl:value-of select="." />
        </a>
    </xsl:template>

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Dat is ook erg handig inderdaad. Maar even een vraagje. Is XSL zo slim dat als je twee maal dezelfde attribuut toevoegt, hij de laatste werkelijk in de tag zet? Mischien een vreemde vraag, maar ik zou dit willen gebruiken bij een element waar twee verschillende attributen kunnen worden opgegeven die beide resulteren in dezelfde attribuut in de tag, maar met een verschillende waarde uiteraard. Voorbeeld hiervoor is een tag die verwijst naar een pagina die een plaatje uit de database haalt. Dit moet kunnen via het nummerieke ID en via de naam van het plaatje. In het element zou dan een name of een id waarde moeten kunnen worden opgegeven. Deze zouden dan beide naar een src attribuut worden getransformeerd. Ik kan natuurlijk wel checken of een attribuut bestaat, maar ik vraag me toch af hoe XSL hier mee omgaat.

Noushka's Magnificent Dream | Unity


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
leuke vragen kom je mee, leer ik ook weer steeds meer van XSLT :)

xml:
code:
1
2
3
4
5
6
<?xml version="1.0"?>
<foo>
    <image id="123" />
    <image name="plaatje.gif" />
    <image id="456" name="plaatje2.gif"/>
</foo>


xslt:
code:
1
2
3
4
5
6
7
8
9
<?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" indent="yes"/>
    <xsl:template match="//image">
        <xsl:element name="img">
            <xsl:attribute name="src"><xsl:value-of select="@id|@name"/></xsl:attribute>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>


output:
code:
1
2
3
[img]"123">
<img[/img]
[img]"456"[/img]

ik snapte de vraag niet 100% , daarom heb ik maar ff drie mogelijkheden geprobeerd waarvan ik dacht dat je zoiets bedoelde. je ziet dattie bij de derde image in dit geval de eerste pakt, omdat in de select de @id eerder komt dan de @name. Uiteraard moet die value-of vervangen worden door een apply-templates (met voor beide attributen een apart template), zodat die id's netjes worden omgekit naar geldige plaatjes-urls, maar dat snap je denk ik wel...

[ Voor 20% gewijzigd door Genoil op 06-12-2003 15:34 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

imho kun je dat beter doen door een aparte template op te zetten voor de verschillende attributen. Als die attributen niet bestaan worden de templates ook niet "uitgevoerd".

zoiets:
XSLT:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<xsl:template match="image">
    <img>
         <xsl:attribute name="src">
             <xsl:apply-templates />
         </xsl:attribute>
    </img>
</xsl:template>

<xsl:template match="img/@id">
    <!-- doe je ding voor een id -->
</xsl:template>

<xsl:template match="img/@name">
     <!-- doe je ding voor een name -->
</xsl:template>


't lijkt omslachtig, maar het is on the long run veel overzichtelijker om elementen zoveel mogelijk onder te verdelen in templates, en zo min mogelijk met for-each, if en dat soort dingen te werken. imho is dat ook de bedoeling van xslt, templates bouwen :) Dan kun je namelijk ook veel meer hergebruiken.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
mja zoiets bedoelde ik dus ook, omdat immers van zo'n kale id toch een url moet maken. de xsl die je postte werkte bij mij dus helaas niet. ik heb 'em ff aangepast zodat ie wel iets deed, en wat wel grappig is, is dat nu het probleem bij de derde image (waar beide zijn ingevuld) nu WEL ineens optreed:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
    <xsl:output method="xhtml" indent="yes"/>
    
    <xsl:template match="//image">
        <xsl:element name="img">
            <xsl:attribute name="src">
                <xsl:apply-templates select="@*"/>
            </xsl:attribute>
        </xsl:element>
    </xsl:template>
    
    <xsl:template match="@id">
        <xsl:value-of select="." />
        <xsl:text>.gif</xsl:text>
    </xsl:template>
    
    <xsl:template match="@name">
         <xsl:value-of select="." />
    </xsl:template>
    
</xsl:stylesheet>


geeft:

code:
1
2
3
    [img]"123.gif"[/img]
    [img]"plaatje.gif"[/img]
    [img]"456.gifplaatje2.gif"[/img]


niet zo fraai dus :) maar ik weet niet of de xml uberhaupt zo aangevoerd kan worden, zowel een id als name in een image is in dit geval redundant, wat me niet de bedoeling lijkt? maar op zich wel een interessant probleem...

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

offtopic:
Welke transformer gebruik jij die een xhtml output method kent? Is dat Saxon? En levert die ook geen problemen op met elementen die een closing-tag moeten hebben voor browsers, zoals bijvoorbeeld script? :)


Ja, je hebt daar wel gelijk in, maar eigenlijk zou je dat moeten voorkomen door in je schema's van het source document vast te leggen dat een image dus niet en een id en een name mag hebben.

offtopic:
Daarnaast is de keuze voor een id attribuutnaam niet zo sterk, aangezien een id waarde maar 1x per document voor mag komen en name ook een vastgelegde semantische waarde heeft. Ik zou eerder kiezen voor bijv. ref-id

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
drm schreef op 06 december 2003 @ 16:37:
offtopic:
Welke transformer gebruik jij die een xhtml output method kent? Is dat Saxon? En levert die ook geen problemen op met elementen die een closing-tag moeten hebben voor browsers, zoals bijvoorbeeld script? :)


Ja, je hebt daar wel gelijk in, maar eigenlijk zou je dat moeten voorkomen door in je schema's van het source document vast te leggen dat een image dus niet en een id en een name mag hebben.

offtopic:
Daarnaast is de keuze voor een id attribuutnaam niet zo sterk, aangezien een id waarde maar 1x per document voor mag komen en name ook een vastgelegde semantische waarde heeft. Ik zou eerder kiezen voor bijv. ref-id
offtopic:
Ik gebruik Sablotron. Ik weet eigenlijk niet eens of dat wel een geldige waarde is voor method. Ik had op een gegeven moment een probleempje dat ie er xml van maakte ipv (x)html (waaraan dat lag is me nog niet geheel duidelijk), vervolgens heb ik die output method op html gezet en dat loste m'n tijdelijke probleem op. toen er later maar xhtml van gemaakt omdat ik dat mooier vind en dat werkte. Maar ja met method="xml" maakt ie nu ook gewoon xhtml...geen idee wat nou het probleem was. Sorry als ik je onterecht nieuwsgierig heb gemaakt :P


verder ben ik met je eens wat betreft het schema en de naamgeving issues

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Het gaat in dit geval niet om de id van het element, maar om de id van het plaatje wat uit de database gehaald moet worden. Dan vind ik dit toch wel de beste naam. Verder wil ik niet te streng zijn kwa dit. Deze tags worden op de site gewoon tussen de tekst geplaatst en ik wil niet opleggen dat slechts 1 van de 2 attributen wordt gebruikt, dat het anders niet werkt dus. De oplossing van Genoil is mooi. Ik had er zelf ook wel op kunnen komen, maar ik moet nog even wennen aan de manier van denken in XSL. Bedankt in ieder geval. :)

Noushka's Magnificent Dream | Unity


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Michali schreef op 06 december 2003 @ 17:19:
De oplossing van Genoil is mooi. Ik had er zelf ook wel op kunnen komen, maar ik moet nog even wennen aan de manier van denken in XSL. Bedankt in ieder geval. :)
Ja maar mijn oplossing werkt dus niet als je zowel id als name je bron element hebt staan he? Wat drm voorstelde is dat je aan de bron xml een regel koppelt die het onmogelijk maakt dat dit gebeurt (dat kan bv met Schema, mist je over een Schema validating parser beschikt).

Dat "denken in XSL" is idd iets waar ik zelf ook erg aan moe(s)t wennen. Wordt helemaal leuk als je straks misschien door stomheid bent geslagen wanneer je erachter komt dat variabelen in XSL niet te veranderen zijn. De truucjes die je dan moet gaan uithalen geven totaal nieuwe inzichten in programmeermethoden.

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Je kunt toch ook een parameter gebruiken? Die zijn volgens mij wel te veranderen. (Althans, zoiets dacht ik gelezen te hebben).

Noushka's Magnificent Dream | Unity


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Michali schreef op 06 december 2003 @ 18:37:
Je kunt toch ook een parameter gebruiken? Die zijn volgens mij wel te veranderen. (Althans, zoiets dacht ik gelezen te hebben).
nee parameters ook niet. beide zij natuurlijk wel dynamisch toe te kennen, en parameters kunnen ook nog eens een weerspiegeling zijn van een gebruikte "traditionele variabele" van buiten de sheet, maar eenmaal toegewezen kun je er niks meer aan veranderen.

is overigens helemaal niet erg hoor. het lijkt beperkend te werken, maar het is helemaal niet de bedoeling xslt als een procedurele programmeertaal te gebruiken. (xslt is een declaratieve programmeertaal). Dat is ook min of meer de reden waarom drm zegt dat het beter is om te werken met (apply-)templates, selects en matches, dan met for-each'es en if's in xslt.

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Genoil schreef op 06 december 2003 @ 16:23:
code:
1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

</xsl:stylesheet>

<xsl:output method="xhtml" indent="yes"/>
XSL 1.0 ondersteund de XHTML output niet. Je moet inderdaad even 2.0 in het stylesheet element zetten.

[ Voor 15% gewijzigd door Michali op 07-12-2003 11:32 ]

Noushka's Magnificent Dream | Unity


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik wil toch eigenlijk wel graag weten hoe je in een schema forceert dat je maar 1 van de 2 attributen kan gebruiken. Ik ben aan het klooien met <xs:choice> maar dat mag schijnbaar niet bij attributen. Iemand een idee hoe ik dit kan oplossen?

Verder dan nog een vraag, hoe kan ik defineren dat iedere attribuut gebruikt mag worden? Dan bedoel ik niet met de anyAttribute element, want moet nog nog steeds ieder attribuut gedefineert worden, maar ik bedoel dat ieder attribuut denkbaar gebruikt mag worden?

Is dat mogelijk of moet ik echt voor ieder attribuut een definitie maken?

Ik zit namelijk te werken met custom tags tussen de HTML voor bijvoorbeeld een plaatje. Deze moet moet naast de verplichte attributen ook ondersteuing hebben ieder HTML attirbuut mogelijk. Is dat te doen?

Noushka's Magnificent Dream | Unity

Pagina: 1