Subject: RE: [xsl] [XSL] Counting Child Nodes? From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Fri, 19 Oct 2007 16:02:20 +0100 |
> <xsl:template match="book"> > <xsl:variable name="rendition"> > <xsl:value-of select="./@rendition"/> > </xsl:variable> Use <xsl:variable name="rendition" select="@rendition"/>. It's shorter and much more efficient. > <div> > <p> > <xsl:choose> > > <xsl:when test="$rendition!=''"> Avoid !=. Use not($rendition = ''). The difference arises when $rendition is an empty sequence. > <div> > <xsl:attribute name="class"> > <xsl:value-of select="$rendition"/> > </xsl:attribute> Use <div class="{$rendition}">, unless you're paid by the number of lines of code you write. > <xsl:if > test="string-length(child::text())<'25'"> Don't put numbers in quotes. You can write this as test="string-length(child::text()) < 25". More importantly, I don't know what you're trying to test. The context node is a <book> element, so its first text node is the whitespace before the first <p>. I can't correct this for you because I simply don't know what you intended. > <xsl:attribute name="style"> > background-image:url('<xsl:value-of > > select="./@rendition"/>.png') </xsl:attribute> > </xsl:if> > <xsl:if test="string-length('25 ' < > child::text() < '50')"> The construct (25 < $x < 50) is no longer allowed in XSLT 2.0. The reason is that although it's valid in 1.0, it doesn't mean what you think it means. If $x is 10, for example, it evaluates (25 < 10) to false, and then evaluates (false() < 50) which converts to (0 < 50) which is true. Write (25 < $x and $x < 50). But it hardly matters: test="string-length(EXPR)" where EXPR is a boolean expression will always return true in 1.0 (in 2.0 it gives you a type error, the argument must be a string). You meant test="25 < string-length($x) and string-length($x) < 50)" > <xsl:attribute name="style"> > background-image:url('<xsl:value-of > > select="./@rendition"/>_med.png') </xsl:attribute> > </xsl:if> > <xsl:if test="count(child::p) > 1"> > <xsl:attribute name="style"> > background-image:url('<xsl:value-of > > select="./@rendition"/>_large.png') </xsl:attribute> > </xsl:if> Rather than generating three attributes called style, of which all but the last will be discarded, I would be inclined to use xsl:choose and only generate one of them. In fact, I would put the conditional logic up front: <xsl:variable name="png-suffix"> <xsl:choose> <xsl:when test="..."/> <xsl:when test="...">_med</xsl:when> <xsl:when test="...">_large</xsl:when> </xsl:choose> </xsl:variable> <div class="{$rendition}" style="background-image:url('{$rendition}{$png_suffix}.png')"> Having said all this, I don't know why your code isn't working, but I would fix the above so you have something slightly more respectable to debug. Michael Kay http://www.saxonica.com/ > > <p> > <xsl:call-template name="rend"/> > <xsl:apply-templates/> > </p> > </div> > </xsl:when> > <xsl:otherwise> > <!--Don't display anything--> > </xsl:otherwise> > </xsl:choose> > </p> > </div> > </xsl:template> > > XML: > > <book topic="Technology" rendition="xslt" author="Tennison, Jeni" > title="Beginning XSLT"> > > <p>New York: Apress, 2002.</p> > <p>The book serves as an introduction to XSLT based on > the examples of a television program set. A resourceful book > for those new to the technology.</p> > </book> > > I want to use the code displayed above (XML) to display the > file name with the name of xslt_large, and now in the HTML > source it does not display that, even though the code above > has two <p> tags. Can anyone please help me out? > > Anything is appreciated. > > Alice
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] [XSL] Counting Child Node, Scott Trenda | Thread | RE: [xsl]Counting Child Nodes?, Alice Ju-Hsuan Wei |
RE: [xsl] [XSL] Counting Child Node, Scott Trenda | Date | [xsl] multiple transformations (pip, Oliver Lietz |
Month |