This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: dynamic testing of an attribute
- To: "Christof Schneider" <Christof_Schneider at gmx dot de>
- Subject: Re: dynamic testing of an attribute
- From: Jeni Tennison <mail at jenitennison dot com>
- Date: Mon, 30 Oct 2000 11:46:43 -0400 (EST)
- Cc: "xsl-Mulberry List" <xsl-list at mulberrytech dot com>
- Reply-To: xsl-list at mulberrytech dot com
Christof,
><xsl:if test="./@*[name()=$attname]"> //does not work!
You con't say *how* it doesn't work, but it's probably to do with using the
shorthand . in a test, which is not allowed. The intent of your test is:
test="@*[name() = $attname]"
so try that instead.
> <attribute name="width">
> <xsl:value-of select="???"/> //how to specify the value of the
>attribute?
> </attribute>
Presumably you want the value of the $attname attribute? The value of an
attribute is given as its string value; the xsl:value-of instruction gives
the string value of whatever XPath is specified within the select
expression. So if you want the value of an attribute within the
xsl:value-of, then use an XPath that points to that attribute:
<xsl:value-of select="@*[name() = $attname]" />
If this is what you wanted, then to prevent the same attribute being
searched for twice (once in the xsl:if test, and once in the xsl:value-of
select), then you could assign the attribute to a variable and query that:
<xsl:variable name="att" select="@*[name() = $attname]" />
<xsl:if test="$att">
<foo>
<attribute name="width"><xsl:value-of select="$att" /></attribute>
</foo>
</xsl:if>
A couple of things to note here. One is that the xsl:if tests whether the
attribute is *present* rather than whether the attribute has a value. In
other words, if $attname is 'bar', then:
<foo bar="" />
would have the test return true. If you want to test whether the attribute
is present *and* has a value, then use:
test="string($att)"
instead.
The second thing is that I just wanted to check that you really wanted to
create output that looked like:
<foo>
<attribute name="width">value</attribute>
</foo>
or whether you were actually after:
<foo width="value" />
If the latter, then you need to prefix your 'attribute' elements with xsl:
to put them in the XSLT namespace and have the XSLT processor recognise
them as instructions. Alternatively, you can use an attribute value
template to achieve the same effect:
<foo width="{$att}" />
I hope that this helps,
Jeni
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list