Subject: RE: [xsl] Stange behavior with parameters, can somebody explain? From: "Michael Kay" <michael.h.kay@xxxxxxxxxxxx> Date: Thu, 17 Jan 2002 09:48:38 -0000 |
When you write <xsl:apply-templates select='exsl:node-set($SYNTH)'> you are invoking the template rule for the root node of the temporary tree. You haven't defined an explicit template for this node, so it calls the built-in template. The built-in template does an <xsl:apply-templates/> to process the children of the root node, but it doesn't pass on the parameters. Solution: write <xsl:apply-templates select='exsl:node-set($SYNTH)/*'> Mike Kay > -----Original Message----- > From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx > [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx]On Behalf Of Gunther > Schadow > Sent: 17 January 2002 07:45 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Stange behavior with parameters, can somebody explain? > > > Help! I'm ripping my heair out on this one. Please explain > why the effect of with-param in apply-templates select='expr' > depends on whether expr is an xpath selector on the current > document or a synthesized node-set. > > This is my XML file: > > <ROOT><FOO/><BAR/></ROOT> > > And this is the common part of an XSLT: > > <xsl:stylesheet > version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:exsl="http://exslt.org/common" > exclude-result-prefixes="exsl"> > <!-- For MSXSL use this instead > xmlns:exsl="urn:schemas-microsoft-com:xslt" > --> > > <xsl:output method='xml' encoding="iso-8859-1" indent='yes'/> > > <xsl:template match="ROOT"> > <xsl:copy> > <xsl:apply-templates select='child::node()[1]'/> > </xsl:copy> > </xsl:template> > > <xsl:template match="BAR"> > <xsl:param name='P'/> > <BAR P='{$P}'/> > </xsl:template> > > <!-- variant here --> > > </xsl:stylesheet> > > > Now I show you two variants of templates to deal with the FOO > element. The first one uses the xpath selector: > > <xsl:template match="FOO"> > <FOO/> > <xsl:apply-templates select='following-sibling::node()[1]'> > <xsl:with-param name='P' select="'V'"/> > </xsl:apply-templates> > </xsl:template> > > when I run the transform, the result is: > > <?xml version="1.0" encoding="iso-8859-1"?> > <ROOT> > <FOO/> > <BAR P="V"/> > </ROOT> > > as it should be. However, when I use this variant: > > <xsl:template match="FOO"> > <FOO/> > <xsl:variable name='SYNTH'> > <BAR/> > </xsl:variable> > <xsl:apply-templates select='exsl:node-set($SYNTH)'> > <xsl:with-param name='P' select="'V'"/> > </xsl:apply-templates> > </xsl:template> > > the result is > > <?xml version="1.0" encoding="iso-8859-1"?> > <ROOT> > <FOO/> > <BAR P=""/> > </ROOT> > > as you see, here the parameter P <= V was not carried into the > applied templates. Why is that? > > I tried with both saxon and msxml and they both do the same > thing. > > Whatever it is, it is very obscure and makes my life very > difficult. > > Of course you don't see the use case from this dummed down > example. My use case is string parsing for 'up-translation' > where I match a head of a string then clip off the head > and apply the templates on the rest of the text node. I > cannot pass any parameters through this kind of process, > ouch! > > regards > -Gunther > > > PS: workaround seems to be to wrap the rest of the > text node in an element with parameters as attributes > or something. Argh! > > -- > Gunther Schadow, M.D., Ph.D. > gschadow@xxxxxxxxxxxxxxx > Medical Information Scientist Regenstrief Institute for > Health Care > Adjunct Assistant Professor Indiana University School > of Medicine > tel:1(317)630-7960 http://aurora.regenstrief.org XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Stange behavior with para, Oleg Tkachenko | Thread | Re: [xsl] Stange behavior with para, Gunther Schadow |
RE: [xsl] XSLT match with regex wha, DPawson | Date | Re: [xsl] cascading tags, Joerg Heinicke |
Month |