On Mon, 8 Dec 2003, David Carlisle wrote:
<xsl:template match="$stage">
Your stage variable contains a result tree fragment (or in xslt2 a node set
consisting of a single document node which has a text node child with
value "stagedir") neither of these is an Xpath pattern, so neither can be
used in a match attribute.
Yup, that is what I thought (well, that it wouldn't/shouldn't work) so why
I asked. ;-) But always good to know why it doesn't work. Thanks.
In XSLT 2 however you could do
<xsl:template match="*[name()=$stage]"
as the annoying restriction of not allowing variables in match patterns
is planned to be dropped.
Yup, This has been suggested, and sounds good, unless I'm assuming
I have two elements with different names that I want to normalize to
a single one. (or does <xsl:variable
name="stage">sd|stageDir</xsl:variable> work? )
An alternative approach of course, is rather than try to paramaterise
your tempates so they work for all inputs, do a two pass system that
normalises the input.
Well this is sort of what I'm doing. The original files aren't
xml but cocoa. A perl regular expression changes the cocoa to
an (often) well-formed document of empty elements. so:
<Q Someone> This is a speech
becomes
<Q value="Someone" /> This is a speech
This is then changed to a TEI'ish name form of:
<sp speaker="Someone"/> This is a speech
It is at this stage that I want to normalize everything to the
same names. Because the next stylesheet fills out the xml
(based on suggestions here) and since that is the more
complicated one I want to change it less. This leaves:
<sp><speaker>Someone</speaker>
<l>This is a speech</l>
...
</sp>
ie have a main stylesheet that does
<xsl:template match="title">....
then to customise for your second form, in stead of doing this:
<xsl:variable name="stage">stagedir</xsl:variable>
do this
<xsl:template mode="normalise" match="t">
<title>
<xsl:apply-templates mode="normalise"/>
</title>
</xsl:template>
I'm not sure I understand this. So make a short stylesheet
which moves things like <Q /> to be <sp /> (in example above)
but don't I need to change that each time?
This is more flexible as it can cope with differences in structure that
are slightly greater than just element renaming.
If on the other hand the structures are really identical you might not
need names at all eg your two examples could be handles using patterns
of
match="body/*[1]" (t or title)
match="body/*[position() > 1]" (A or Act)
match="body/*/*" (scn or scene)
They aren't reliably that identical. (I wish!)
-James
---
Dr James Cummings, Oxford Text Archive,
James(_dot_)Cummings(_at_)ota(_dot_)ahds(_dot_)ac(_dot_)uk
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list