Subject: Re: [xsl] variables and inline tags From: Spencer Tickner <spencertickner@xxxxxxxxx> Date: Wed, 4 May 2005 16:00:51 -0700 |
Ok, Sorry Guys Thought I had it all worked out, but still having difficulties. Based on the suggestions I believe my template for definition should look something like this: <xsl:template match="definition" mode="contentsection"> <xsl:choose> <xsl:when test="substring(def, 1, 1)=','"> <p class="def"><strong>"<xsl:apply-templates select="term"/>"</strong>, <xsl:apply-templates select="def"/></p> </xsl:when> <xsl:otherwise> <p class="def"><strong>"<xsl:apply-templates select="term"/>"</strong> <xsl:apply-templates select="def"/></p> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- Defintion --> <xsl:template match="def/text()"> <!-- when a text node is inside a def, this template overrides the built-in template for text nodes, which simply copies out their values --> <xsl:choose> <xsl:when test="not(preceding-sibling::node()) and starts-with(.,',')"> <!-- truncates the first character if it's a comma and this text node has no preceding siblings --> <xsl:value-of select="substring(., 2)"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="."/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="def"> <xsl:apply-templates select="text()|strong|em|sup|sub|u|insert|br|eacute"/> </xsl:template> <xsl:template match="term"> <xsl:apply-templates select="text()|strong|em|sup|sub|u|insert|br|eacute"/> </xsl:template> Right, now that looks all fine to me, except I have these other templates normalizing all my content comming through the pipe: <xsl:template match="text()[preceding-sibling::node() and following-sibling::node()]"> <xsl:variable name="ns" select="normalize-space(concat('x',.,'x'))"/> <xsl:value-of select="substring( $ns, 2, string-length($ns) - 2 )" /> </xsl:template> <xsl:template match="text()[preceding-sibling::node() and not( following-sibling::node() )]"> <xsl:variable name="ns" select="normalize-space(concat('x',.))"/> <xsl:value-of select="substring( $ns, 2, string-length($ns) - 1 )" /> </xsl:template> <xsl:template match="text()[not( preceding-sibling::node() ) and following-sibling::node()]"> <xsl:variable name="ns" select="normalize-space(concat(.,'x'))"/> <xsl:value-of select="substring( $ns, 1, string-length($ns) - 1 )" /> </xsl:template> <xsl:template match="text()[not( preceding-sibling::node() ) and not( following-sibling::node() )]"> <xsl:value-of select="normalize-space(.)"/> </xsl:template> As expected an error occurs when trying to do both of these at the same time: Ambiguous rule match for .......... Matches both "text()[not(preceding-sibling::node()) and not(following-sibling::node())]" and def/text() ....... I've tried a couple of work arounds but I always end up with either a) the problem before, <em> gets dropped b) spacing problems from badly-formatted content Thanks for any help you can offer, Spencer On 5/4/05, Spencer Tickner <spencertickner@xxxxxxxxx> wrote: > Hi Guys, > > Thanks for the great feed-back. It took a bit to figure out how to > modify your template to work in my context (I was matching text-nodes > to remove excess whitespace around inline tags), but I got her working > so thanks for comming through once again. > > Cheers, > > Spencer > > On 5/4/05, Wendell Piez <wapiez@xxxxxxxxxxxxxxxx> wrote: > > Spencer, > > > > The tricky thing here is that to remove the comma without messing with the > > other nodes (as you discovered, when you use the value of the <def> its > > children aren't processed), you need to get at it all the way down at the > > level of the text node. But not just any text node is of interest -- > > actually it's only those that are the first thing inside a <def>, which > > have a comma. > > > > So: > > > > <xsl:template match="def/text()"> > > <!-- when a text node is inside a def, this template > > overrides the built-in template for text nodes, > > which simply copies out their values --> > > <xsl:when test="not(preceding-sibling::node() and starts-with(.,',')"> > > <!-- truncates the first character if it's a comma and this text > > node has no preceding siblings --> > > <xsl:value-of select="substring(., 2)"/> > > </xsl:when> > > <xsl:otherwise> > > <xsl:value-of select="."/> > > </xsl:otherwise> > > </xsl:template> > > > > You may have to adjust this match pattern, or even construct a separate > > mode, to keep this sufficiently isolated from the way you want most text > > nodes to be processed. (I assume you generally don't want to truncate > > initial commas in text nodes.) And it will work irrespective of whether the > > results are bound to a variable, or simply copied out. > > > > If it's mysterious to you why this works -- like most XSLT mysteries, it > > comes back to the processing model (that is, what the processor does when > > you say "apply-templates" or let it default to that). > > > > I hope this helps, > > Wendell > > > > At 04:52 PM 5/4/2005, you wrote: > > >Having problems with variables, applying templates and parsing > > >strings. Been working on it all day and can't seem to wrap my mind > > >around it. > > > > > >Here is my simplified xml: > > > > > ><definition> > > > <term>recognized</term> > > > <def>, under the <em>Company Act</em></def> > > ></definition> > > > > > >What I need to do is substring the def information when it starts with > > >a comma, ie: > > > > > >with comma > > ><p class="def">"recognized", under the <em>Company Act</em></p> > > > > > >without comma > > ><p class="def">"recognized" under the <em>Company Act</em></p> > > > > > >Ok, there's the background. I'm having problems because I'm using a > > >variable to parse out the unwanted space in the with comma example > > >above, then to get the variable I use a value-of statement which > > >promptly drops the <em> tags. Any suggestions or advive would be > > >appreciated. > > > > > > > > >Here's my simplified xsl: > > > > > ><!-- Defintion --> > > ><xsl:template match="definition" mode="contentsection"> > > > <p class="def"> > > > <xsl:choose> > > > <xsl:when test="substring(def, 1, 1)=','"> > > > <strong>"<xsl:apply-templates > > >select="term"/>"</strong>, <xsl:variable name="uncommadef"> > > > <xsl:apply-templates select="def"/> > > > </xsl:variable> > > > > > > <!-- Problem is here --> > > > <xsl:value-of select="substring($uncommadef, 2)"/> > > > </xsl:when> > > > <xsl:otherwise> > > > <strong>"<xsl:apply-templates > > >select="term"/>"</strong> <xsl:apply-templates select="def"/> > > > </xsl:otherwise> > > > </xsl:choose> > > > </p> > > > </xsl:template> > > > <xsl:template match="term"> > > > <xsl:apply-templates > > > select="text()|strong|em|sup|sub|u|insert|br|eacute"/> > > > </xsl:template> > > > <xsl:template match="def"> > > > <xsl:apply-templates > > > select="text()|strong|em|sup|sub|u|insert|br|eacute"/> > > > </xsl:template> > > ><!-- End of Definition --> > > > > ====================================================================== > > Wendell Piez mailto:wapiez@xxxxxxxxxxxxxxxx > > Mulberry Technologies, Inc. http://www.mulberrytech.com > > 17 West Jefferson Street Direct Phone: 301/315-9635 > > Suite 207 Phone: 301/315-9631 > > Rockville, MD 20850 Fax: 301/315-8285 > > ---------------------------------------------------------------------- > > Mulberry Technologies: A Consultancy Specializing in SGML and XML > > ======================================================================
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] variables and inline tags, Spencer Tickner | Thread | Re: [xsl] variables and inline tags, Spencer Tickner |
Re: [xsl] Remove Duplicates from Re, Patrick Lademan | Date | Re: [xsl] variables and inline tags, Spencer Tickner |
Month |