This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Detecting presence of attributes
- To: Peter Flynn <peter at silmaril dot ie>
- Subject: Re: [xsl] Detecting presence of attributes
- From: Jeni Tennison <mail at jenitennison dot com>
- Date: Mon, 5 Feb 2001 18:40:01 +0000
- CC: xsl-list at lists dot mulberrytech dot com
- Organization: Jeni Tennison Consulting Ltd
- References: <jUsT.aNoTheR.mEsSaGe.iD.9813933056415@silmaril.ie>
- Reply-To: xsl-list at lists dot mulberrytech dot com
Hi Peter,
> <thesis faculty="arts" department="history" options="foo bar blort">
>
> where foo.sty, bar.sty, and blort.sty are among the allowed options
> (ie declared entities in the DTD) for translation to LaTeX's
> \usepackage{foo,bar,blort}. Just a safety check to make sure a
> student doesn't go haywire.
Well, inspired by Dimitre's insight about id(), here's a solution that
doesn't involve recursive templates, as long as you don't mind
repeating in the stylesheet the list of allowed options:
<?xml version="1.0"?>
<!DOCTYPE xsl:stylesheet [
<!ATTLIST thesis:opt id ID #REQUIRED>
]>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:thesis="http://www.silmaril.ie/thesis"
exclude-result-prefixes="thesis">
<thesis:opts>
<thesis:opt id="foo" />
<thesis:opt id="bar" />
</thesis:opts>
<xsl:template match="thesis">
<xsl:text>Options: </xsl:text>
<xsl:variable name="options" select="@options" />
<!-- change the context to the stylesheet document -->
<xsl:for-each select="document('')/*">
<!-- get the id attributes of any options identified by ID -->
<xsl:for-each select="id($options)/@id">
<xsl:value-of select="." />
<xsl:if test="position() != last()">, </xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
It has the advantage that you can deal with bad values (e.g. if
'blort' wasn't actually allowed) within the stylesheet - if that's an
advantage.
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list