[XSLT] - variabele include

Pagina: 1
Acties:

  • BasSpruit
  • Registratie: September 2002
  • Laatst online: 09-04-2022
Onder XSL kan je een include oproepen dmv
code:
1
<xsl:include href="URI"/>
(komt van www.w3wschools.com/xsl af.)

nu heb ik dit wel eens geprobeerd:
code:
1
<xsl:include href="$url"/>
waar $url de variabele is waar een pagina url in staat. (vooraf gedeclareerd natuurlijk

ik heb het ook op deze manier gedaan:
code:
1
<xsl:include href="{root/ur}"/>


beide manieren werken echter niet, ik krijg dan de foutmelding dat $url of {root/url} niet gevonden kan worden.

is het uberhaupt mogelijk om hier een variabele in te vullen, of heb ik gewoon pech gehad?

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
In welke taal declareer je die variabelen dan? Ik heb ook niet echt een mooi manier kunnen vinden, maar omdat ik met PHP werk doe ik eerst een string replace op de xsl stylesheet. Dat werkt wel..

Noushka's Magnificent Dream | Unity


  • Rickets
  • Registratie: Augustus 2001
  • Niet online

Rickets

Finger and a shift

ChaosDream schreef op 05 december 2003 @ 10:49:
is het uberhaupt mogelijk om hier een variabele in te vullen, of heb ik gewoon pech gehad?
Het is niet mogelijk om een xsl-variabele in te vullen bij import en include, omdat variabelen run-time worden ingevuld, terwijl de href van een import/include compile-time al bekend moet zijn.

If some cunt can fuck something up, that cunt will pick the worst possible time to fucking fuck it up, because that cunt’s a cunt.


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ik heb hier wel een soort van oplossing voor gevonden. mijn probleem was ook "dynamische imports". mijn doel was, om slechts de benodigde xsl files te importeren, aan de hand van een dynamische set xml bronnen die ik als source gebruikte. de truuc is, om de bron-xml 2 keer te transformeren, 1 keer om uit zoeken welke stylesheets er allemaal nodig zijn, en 1 keer om de uiteindelijke pagina te renderen. de extra processing tijd van die eerste trap is eenvoudig te ondervangen met een cache-functie (zit niet in het voorbeeld).

't is een beetje een ranzig voorbeeldje en wat er gebeurd slaat helemaal nergens op maar 't ging me om het idee. heb em inmiddels wel wat netter. het grote nadeel is natuurlijk, dat je style informatie in je xml hebt zitten en da's natuurlijk niet zo fraai...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Allocate a new XSLT processor
$xh = xslt_create();
xslt_set_base( $xh, 'file://' . $_SERVER["SCRIPT_FILENAME"] );

// Process the style
if (xslt_process($xh, 'content.xml', 'step1.xsl', 'step2.xsl')) 
{
    // Process the content
    if (xslt_process($xh, 'content.xml', 'step2.xsl', 'result.xml')) 
    {
        readfile('result.xml');
    }
}

xslt_free($xh);


content.xml:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" ?>
<cmspage>
    <template name="page">page.xslt</template>
    <title>this is a page</title>
    <paragraph>
        <template name="default">default.xslt</template>
        <content>this is a paragraph</content>
    </paragraph>
    <paragraph>
        <template name="green">green.xslt</template>
        <content>this is a paragraph</content>
    </paragraph>
    <paragraph>
        <template name="alternative">alternative.xslt</template>
        <content>this is a paragraph</content>
    </paragraph>
</cmspage>



step1.xsl:

XSLT:
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"?>
<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
    <xsl:template match="/">
        <xsl:element name="xsl:stylesheet">
            <xsl:attribute name="version">1.0</xsl:attribute>
            <xsl:attribute name="xmlns:xsl">http://www.w3.org/1999/XSL/Transform</xsl:attribute>                
            <xsl:apply-templates />
            <xsl:element name="xsl:template">
                <xsl:attribute name="match">/</xsl:attribute>
                <xsl:element name="xsl:apply-templates" />
            </xsl:element>
        </xsl:element>
    </xsl:template>
    <xsl:template match="template">
        <xsl:element name="xsl:import">
            <xsl:attribute name="href">
                <xsl:value-of select="." />
            </xsl:attribute>
        </xsl:element>
    </xsl:template>
     <xsl:template match="content|title" />
</xsl:stylesheet>


de step2.xsl die daar dynamisch uit gegenereerd word is:
XSLT:
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:import href="page.xslt"/>
    <xsl:import href="default.xslt"/>
    <xsl:import href="green.xslt"/>
    <xsl:import href="alternative.xslt"/>
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>


en hier ter illustratie nog default.xslt (om de nutteloosheid van dit script maar weer eens aan te tonen :P)
XSLT:
1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
    <xsl:template match="paragraph/template[@name='default']">
        <p style ="color:#FF0000">
            <xsl:value-of select="../content" />
        </p>
    </xsl:template>
    <xsl:template match="content" />
</xsl:stylesheet>


o en niet letten op de af en toe wat rare en redundante rommel her en der, het werkt immers wel!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
In de PHP docs staat iets over argumenten die je aan de xslt_process() functie kunt mee geven. Het schijnt zo te werken (zelf nog nooit geprobeerd):
PHP:
1
2
3
4
5
6
7
8
9
10
$xh = xslt_create();

$args = array 
( 
  '/_xml' => file_get_contents('data.xml'),
  '/_xsl'=> file_get_contents('stylesheet.xsl'),
  '/xslinclude' => 'include.xsl'
);

print xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', null, $args);

In het XSL document moet je dan het argument zo gebruiken:
code:
1
<xsl:include href="arg:/xslinclude"/>


Die / voor het argument is niet nodig maar het schijnt wel beter te zijn.

[ Voor 13% gewijzigd door Michali op 06-12-2003 13:54 ]

Noushka's Magnificent Dream | Unity


  • BasSpruit
  • Registratie: September 2002
  • Laatst online: 09-04-2022
Michali schreef op 06 december 2003 @ 13:54:
In de PHP docs staat iets over argumenten die je aan de xslt_process() functie kunt mee geven. Het schijnt zo te werken (zelf nog nooit geprobeerd):
PHP:
1
2
3
4
5
6
7
8
9
10
$xh = xslt_create();

$args = array 
( 
  '/_xml' => file_get_contents('data.xml'),
  '/_xsl'=> file_get_contents('stylesheet.xsl'),
  '/xslinclude' => 'include.xsl'
);

print xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', null, $args);

In het XSL document moet je dan het argument zo gebruiken:
code:
1
<xsl:include href="arg:/xslinclude"/>


Die / voor het argument is niet nodig maar het schijnt wel beter te zijn.
nu ken ik geen php (ben ASP progger...), kan het wel begrijpen (denk ik:p) maar dit geldt dus als variabele include in xsl?

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
hmm xsl als argument meegeven...normaalgesproken geef je daarmee dynamische stukjes content (xml) mee, ik geloof niet dat deze xsl zomaar automagisch aan je xsl wordt toegevoegd.

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Het ging eigenlijk meer om het derde argument. Je kan het ook op deze manier oplossen:

PHP:
1
2
3
4
5
6
7
8
$xh = xslt_create();

$args = array 
( 
  '/xslinclude' => 'include.xsl'
);

print xslt_process($xh, 'data.xml', 'stylesheet.xsl', null, $args);

Noushka's Magnificent Dream | Unity


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Michali schreef op 08 december 2003 @ 10:07:
Het ging eigenlijk meer om het derde argument. Je kan het ook op deze manier oplossen:

PHP:
1
2
3
4
5
6
7
8
$xh = xslt_create();

$args = array 
( 
  '/xslinclude' => 'include.xsl'
);

print xslt_process($xh, 'data.xml', 'stylesheet.xsl', null, $args);
ja, van hetzelfde laken een pak, maar hoe weet de proc dan dat dat argument xsl includes bevat? is /xslinclude een reserved word oid?

[ Voor 7% gewijzigd door Genoil op 08-12-2003 11:24 ]


  • BasSpruit
  • Registratie: September 2002
  • Laatst online: 09-04-2022
sorry, maar ik snap niet veel van die php code.

een xsl pagina aanwijzen (waarde vullen) in een xml doc is niet zo moeilijk.
XML:
1
2
3
4
<root>
       <url>pagina.xsl</url>
       <de_rest />
</root>


en om nou van elke xsl pagina een asp pg te maken alleen hiervoor lijkt me overbodig. hoe meer statische content (ten opzichte van scriptPG`s), des te sneller je site...

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ChaosDream schreef op 09 december 2003 @ 12:04:
sorry, maar ik snap niet veel van die php code.

een xsl pagina aanwijzen (waarde vullen) in een xml doc is niet zo moeilijk.
XML:
1
2
3
4
<root>
       <url>pagina.xsl</url>
       <de_rest />
</root>


en om nou van elke xsl pagina een asp pg te maken alleen hiervoor lijkt me overbodig. hoe meer statische content (ten opzichte van scriptPG`s), des te sneller je site...
ok. stel nou, dat pagina.xsl de template bevat die het root element transformeert. hoe ga jij dan tegen je xslt processor vertellen dattie pagina.xsl moet includen? stel dat de xml die je daar post dynamisch gegenereerd wordt adhv een gebruikerskeuze, waardoor hij er bijvoorbeeld ook zo uit kan zien:

XML:
1
2
3
4
<root>
       <url>pagina-met-andere-opmaak.xsl</url>
       <de_rest />
</root>


die dus het root element op een andere manier transformeert dan pagina.xsl...

succes :P

[ Voor 5% gewijzigd door Genoil op 09-12-2003 12:23 ]


  • BasSpruit
  • Registratie: September 2002
  • Laatst online: 09-04-2022
op dit moment begint elk van mijn xml pagina`s met het volgende:
ASP:
1
2
3
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="<%= layout %>news.xsl"?>
<!DOCTYPE ACW SYSTEM "Include/ACW.dtd">


[note]<%= layout %> bevat de mapnaam waar news.xsl in staat[/note]

in news.xsl staat mijn volledige stylesheet, inclusief menu`s, copyrights en stuff. nu leek het mij een goed idee om van news.xsl een include te maken, en standaard een bestandje te maken waar news.xsl wordt aan toegevoegd. zo kan ik in 1 klap de omgeving veranderen, zonder elk bestandje aan te passen...

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ChaosDream schreef op 09 december 2003 @ 13:03:
op dit moment begint elk van mijn xml pagina`s met het volgende:
ASP:
1
2
3
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="<%= layout %>news.xsl"?>
<!DOCTYPE ACW SYSTEM "Include/ACW.dtd">


[note]<%= layout %> bevat de mapnaam waar news.xsl in staat[/note]

in news.xsl staat mijn volledige stylesheet, inclusief menu`s, copyrights en stuff. nu leek het mij een goed idee om van news.xsl een include te maken, en standaard een bestandje te maken waar news.xsl wordt aan toegevoegd. zo kan ik in 1 klap de omgeving veranderen, zonder elk bestandje aan te passen...
hmmz, logica in je content :X

[ Voor 13% gewijzigd door Genoil op 09-12-2003 13:55 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Is dit dan wat je ongeveer bedoeld?

document.xml
code:
1
2
3
4
5
6
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>

<data>
...
</data>


stylesheet.xsl
code:
1
2
3
4
5
6
7
<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:include href="news.xsl"/>

</xsl:stylesheet>


En dan is news.xsl de 'echte' stylesheet? Is dat wat je een beetje bedoeld of ben aan het blaten? Als je nu in elke pagina stylesheet.xsl include dan hoef je alleen die aan te passen wil je het uiterlijk overal veranderen. (je kunt overigens ook XSL outputten en dat document weer gebruiken)

[ Voor 15% gewijzigd door Michali op 09-12-2003 14:39 ]

Noushka's Magnificent Dream | Unity


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Michali schreef op 09 december 2003 @ 14:39:
(je kunt overigens ook XSL outputten en dat document weer gebruiken)
dat is dus zo ongeveer wat mijn twee-traps transformatie (zie lap code hierboven)doet. ben overigens inmiddels alweer van dat idee af...ik hoef niet zonodig meer dynamische includes :)

  • BasSpruit
  • Registratie: September 2002
  • Laatst online: 09-04-2022
Michali schreef op 09 december 2003 @ 14:39:
Is dit dan wat je ongeveer bedoeld?

document.xml
code:
1
2
3
4
5
6
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>

<data>
...
</data>


stylesheet.xsl
code:
1
2
3
4
5
6
7
<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:include href="news.xsl"/>

</xsl:stylesheet>


En dan is news.xsl de 'echte' stylesheet? Is dat wat je een beetje bedoeld of ben aan het blaten? Als je nu in elke pagina stylesheet.xsl include dan hoef je alleen die aan te passen wil je het uiterlijk overal veranderen. (je kunt overigens ook XSL outputten en dat document weer gebruiken)
ja, maar nu moet ik op de plaats van "news.xsl" een variabele kunnen gebruiken. dan kan ik 1 XSL pagina maken met de omliggende layout (links, extra info, copyrights en overige) en dan alleen in "news.xsl" de inhoud die ik wil laten displayen.

mijn huidige "news.xsl" :
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Anime Club Wieringermeer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <meta http-equiv="pragma" content="no-cache" />
    <meta http-equiv="cache-control" content="no-cache" />
    <meta http-equiv="imagetoolbar" content="no" />
    <link rel="stylesheet" type="text/css" href="../Include/Stylesheet.css" />
</head>

<body>
<div style="position: absolute; left: 50; top: 110;">|
    <xsl:for-each select="acw/links/link">
        <a>
            <xsl:attribute name="href">
                <xsl:value-of select="url"/>
            </xsl:attribute>
            <xsl:attribute name="title">
                <xsl:value-of select="tooltip"/>
            </xsl:attribute>
            <xsl:value-of select="text"/>
        </a> |
    </xsl:for-each>
</div>
<a name="top"></a>
<table cellspacing="0" cellpadding="0" class="main">
  <tr>
    <td class="top">[img]"../images/top.jpg"[/img]</td>
  </tr>
  <tr>
    <td class="main" id="mainbody" valign="top"><!-- Begin -->
    <center><b>&lt;('-')&gt; NEWS &lt;('-')&gt;</b></center>
    <hr/>
    <table style="width: 100%;">
    <xsl:for-each select="acw/newsitems/item">
        <tr>
            <th class="Menu">Date:</th>
            <td><xsl:value-of select="date"/></td>
        </tr>
        <tr>
            <th class="Menu">News:</th>
            <td valign="top"><xsl:value-of select="news"/></td>
        </tr>
        <tr>
            <td colspan="2"><hr/></td>
        </tr>
    </xsl:for-each>
    </table>
    <!-- End --></td>
  </tr>
  <tr>
    <td class="bottom" valign="top">© 2003 copright: ChaosDream [Anime club wieringermeer] - All rights reserved</td>
  </tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

je ziet in de code 2 comments staan (begin en eind). DAT stukje wilde ik graag als dynamische include. (misschien dat het nu duidelijker wordt... ?) de rest v/d code blijft staan, en kan ik weer gebruiken voor een andere include. ( ik heb een x-aantal xsl pagina`s waarbij diezelfde code word gebruikt. ga ik nu echter 1 dingetje aanpassen op 1 PG, dan moet ik er gelijk 7 andere ook aanpassen. (geen punt, maar je maakt snel fouten)

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
oow bedoel je DAT? (nog steeds niet helemaal zeker, maar ik gok erop)

waarom maak je dan niet gewoon een page.xsl waarin je je templates stopt die je op elke pagina nodig hebt, en import je die vanuit news.xsl (en ook vanuit al je andere pagina-specifieke templates). in news.xsl maak je dan een template die het stuk tussen begin en end afhandelt.

of snap ik het weer niet? :?

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Je kunt in ieder geval een include doen door de include in de XSL stylesheet te transformeren.

Je stylesheet zou er dan zo uit kunnen zien:
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="ISO-8859-1"?>

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xslr="http://www.w3.org/1999/XSL/Transform/alias">

<xsl:output method="xml"/>

<xsl:namespace-alias stylesheet-prefix="xslr" result-prefix="xsl"/>

<xsl:template match="/stylesheet">
    <xslr:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xslr:output method="xml"/>
    
    <xslr:include href="{file}"/>   
    
    </xslr:stylesheet>
</xsl:template>

</xsl:stylesheet>

En je XML document met de waarde voor de pagina ziet er dan zo uit:
code:
1
2
3
4
5
<?xml version="1.0" encoding="ISO-8859-1"?>

<stylesheet>
    <file>news.xsl</file>
</stylesheet>

Dit is ook de methode waar Genoil het steeds over heeft. Ik denk dat je hier wel mee verder kunt.

Noushka's Magnificent Dream | Unity


  • BasSpruit
  • Registratie: September 2002
  • Laatst online: 09-04-2022
Genoil schreef op 10 december 2003 @ 13:43:
oow bedoel je DAT? (nog steeds niet helemaal zeker, maar ik gok erop)

waarom maak je dan niet gewoon een page.xsl waarin je je templates stopt die je op elke pagina nodig hebt, en import je die vanuit news.xsl (en ook vanuit al je andere pagina-specifieke templates). in news.xsl maak je dan een template die het stuk tussen begin en end afhandelt.

of snap ik het weer niet? :?
dit is een goeie, kan je alles wat je wilt in zo`n template zetten?

[edit]`t is een ietsje meer werk, maar het werkt wel. bedankt joh! :)

[ Voor 7% gewijzigd door BasSpruit op 10-12-2003 16:26 . Reden: update ]


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Michali schreef op 10 december 2003 @ 13:51:
code:
1
<xsl:namespace-alias stylesheet-prefix="xslr" result-prefix="xsl"/>

Dit is ook de methode waar Genoil het steeds over heeft.
Haha ik zal er over ophouden :+
Uiteindelijk bleek de bedoeling dus veel eenvoudiger te zijn...

Maar wel handig hej dat namespace-alias!
Pagina: 1