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

)
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!