Hi,
-----Original Message-----
From: Duncan Anker [mailto:danker(_at_)server101(_dot_)com]
Hi List,
I have a setup where I want to store my HTML pages as XML and
use XSLT
to apply common layout features, e.g. headers and footers. I
also need
to pass dynamic data into some of the pages, and rather than process
everything twice I (perhaps foolishly) thought I could use
parameters to
send the data in. So I have a $parameters variable which contains a
string something like '<parameters><namespace variable1="value"
variable2="value" /></parameters>'
In my HTML fragments where I want to place a variable, I use
a call-out like
<variable name="namespace:variable1" />
Then in my XSLT I have this:
<xsl:template match="variable">
<xsl:variable name="a" select="substring-before(@name, ':')" />
<xsl:variable name="b" select="substring-after(@name, ':')" />
<xsl:value-of select="exslt:node-set($parameters)//*[name() =
$a]/@*[name() = $b]" />
</xsl:template>
[As an aside, I couldn't get the substring-before and -after to work
directly in the XPath expression. Am I missing something, or do they
need to be assigned to variables like that to be used?]
You probably missed to use the current() function; the context
node changes in predicate expressions.
Try with:
<xsl:value-of
select="c:node-set($parameters)//*[name() =
substring-before(current()/@name, ':')]/@*[name() =
substring-after(current()/@name, ':')]" />
This all seems to work well enough when the $parameters string is set
inside the stylesheet, however when I try to pass it in as a global
The content of a xsl:param is a sequence constructor (or "template"),
and will generate a result tree fragment hold by the parameter
"$parameters":
<xsl:param name="parameters">
<foo bar="my-value"/>
</xsl:param>
So it's a tree - with nodes and everything.
parameter I get empty results. I know the string is making it
in because
<xsl:value-of select="$parameters" /> prints out the escaped string.
What I can't figure out is why it is not being treated the
same way as a
local variable would be.
Libxslt has no support for passing in tree fragments as parameter
values.
If you pass something in, then it is treated as a string. Libxslt does
not
automagically parse the given string and convert it to a tree fragment.
Maybe you should open an enhancement request for this feature.
Can anyone shed any light on this? I've spent 2 days banging my head
against Google so far. I am trying to do this with PHP 5.1.4 compiled
against libXML and lbXSLT, versions 2.6.23 and 1.1.15
respectively. I'd
like to finger PHP as the culprit, but I get the same results when
running xsltproc over the documents.
If it's not too much overhead for you, then you could use the document()
function to obtain the tree containing your parameters.
Example:
"test.xsl"
----------
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--
The default URI for the XML document containing parameters.
Override it with an externally provided parameter value.
-->
<xsl:param name="parameters-uri">params.xml</xsl:param>
<xsl:template match="variable">
<xsl:variable name="parameters" select="document($parameters-uri)"/>
<xsl:value-of select="$parameters//*[name() =
substring-before(current()/@name, ':')]/@*[name() =
substring-after(current()/@name, ':')]" />
</xsl:template>
</xsl:stylesheet>
"params.xml"
------------
<?xml version="1.0"?>
<foo bar="my-value"/>
"variables.xml"
---------------
<?xml version="1.0"?>
<variable name="foo:bar"/>
Result of xsltproc:
xsltproc test.xsl variables.xml
<?xml version="1.0"?>
my-value
Regards,
Kasimier
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--