RE: [xsl] node positioning problem

Subject: RE: [xsl] node positioning problem
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 30 Mar 2005 19:54:31 +0100
This 

        <xsl:for-each select="child::BBB">
            <xsl:if test="position() = 1">
                <xsl:copy-of select="BBB"/>
            </xsl:if>
        </xsl:for-each>

could be replaced by

<xsl:copy-of select="BBB[1]"/>

In this:

<xsl:when test="not(count(preceding-sibling::*[name()=name(current())])+1) =
1">

you know that the name of the current element is BBB, so it's the same as

test="not(count(preceding-sibling::BBB)+1) = 1"

which probably should be corrected to:

test="not(count(preceding-sibling::BBB)+1 = 1)"

or better still

test="not(preceding-sibling::BBB)"


XSLT can be verbose, but it doesn't have to be!


Michael Kay
http://www.saxonica.com/
 

> -----Original Message-----
> From: Spencer Tickner [mailto:spencertickner@xxxxxxxxx] 
> Sent: 30 March 2005 19:14
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] node positioning problem
> 
> Hi everyone, thanks for the help and all the great responses I've
> gleened from ya.
> 
> Here we go I got an xml file like so
> 
> <!-- AA2 exists -->
> <AAA>
>     <AAA1></AAA1>
>     <AAA2></AAA2>
>     <BBB></BBB>
>     <CCC></CCC>
>     <BBB></BBB> 
> </AAA>
> <!-- AA2 does not exist -->
> <AAA>
>     <AAA1></AAA1>
>     <BBB></BBB>
>     <BBB></BBB>
>     <CCC></CCC>
> </AAA>
> 
> Ok, now in a quick pseudo what I need is
> 
> <!-- If AA2 does exist -->
> <h4>AAA1 AAA2</h4>
> <h6>BBB</h6>
> <h6>BBB</h6>
> 
> <!-- If AA2 does not exist -->
> <h4>AA1 BBB</h4>
> <h6>BBB</h6>
> 
> Here are my current templates
> 
> <!-- This template works fine and dandy -->
> <xsl:template match="AAA">
>     <h4>
>     <xsl:copy-of select="AAA1"/>
>     <xsl:choose>
>     <xsl:when test="AAA2"/>
>         <xsl:copy-of select="AAA2"/>
>     </xsl:when>
>     <xsl:otherwise>
>         <xsl:for-each select="child::BBB">
>             <xsl:if test="position() = 1">
>                 <xsl:copy-of select="BBB"/>
>             </xsl:if>
>         </xsl:for-each>
>      </xsl:otherwise>
>      </xsl:choose>
>      <h4>
>      <xsl:apply-templates/>
> </xsl:template>
> 
> <!-- This is where I get confused -->
> <xsl:template match="BBB">
>         <h6>
> 	<xsl:choose>
>         <!-- If there is an AAA2 we always put down BBB -->
> 	<xsl:when test="parent::AAA/AAA2">
> 		<xsl:copy-of select="BBB"/>
> 	</xsl:when>
>         
>        <!-- This doesn't work but it should skip the first BBB and
> grab the rest -->
> 	<xsl:when 
> test="not(count(preceding-sibling::*[name()=name(current())])+1)
> = 1">
> 		<p class="sub">(<xsl:copy-of 
> select="subsectionnumber"/>)&#160;
> 		<xsl:copy-of select="subsectiontext"/></p>
> 	</xsl:when>
> 	</xsl:choose>
>        </h6>
> 	<xsl:apply-templates/>
> </xsl:template>
> 
> Ok, I think that about covers it, thanks for any help or 
> advice you can offer
> 
> Spencer

Current Thread