[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
Re: Can I add new element?
Subject: Re: Can I add new element? From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> Date: Tue, 01 Aug 2000 21:09:34 +0100 |
Yuko, >I'm trying to generage output into wml. When a return from database is more >than 7, new element is added and also insert a new card. You say that you've figured out how to split the titles into cards, but don't know how to insert a 'More' choice when you need to. How you do it exactly is dependent on how you're dividing your input up into cards in the first place. Basically, you need to check whether there is another 'title' element to process after the last one you processed. If there is, then you want to output a 'More' choice; if not, then you don't. Here's how I've approached the problem - hopefully the solution will map onto yours fairly easily. The first thing I did is create a parameter to hold the magic number 7, just in case you want to change it in the future: <xsl:param name="group-size" select="'7'" /> When you have a grouping problem, you need to: (a) identify the first thing in each group and (b) identify all the other things in the group, based on knowing the first one When you're grouping into groups of a certain size based on position, you can find the first things in each group by looking at the position() of the thing mod the size of the group. The first in each group will have a value of '1', the second a value of '2' and so on. You want to apply templates to only these things, in your case 'title' elements: <xsl:template match="book"> <wml> <xsl:apply-templates select="title[(position() mod $group-size) = 1]" /> </wml> </xsl:template> Now, a 'title'-matching template will only be processed on the first title in each group. When the 'title'-matching is processed, the current node list is comprised of only those title elements that are first in each group: the position() of the title element within this list gives you the number of the card to use. The group consists of the current title (the first in the group) plus the next 6 titles, in other words, the following sibling titles whose position is less than the size of the group. You have a choice for each of those. Then, if there is a 7th title element following the first in the group, then that title element is going to be in a new card - in that case, you need a 'More' choice. <xsl:template match="title"> <xsl:variable name="card-no" select="position()" /> <card id="{$card-no}"> <select> <xsl:for-each select=". | following-sibling::title[position() < $group-size]"> <choice><xsl:value-of select="." /></choice> </xsl:for-each> <xsl:if test="following-sibling::title[position() = $group-size]"> <choice onpick="#{$card-no + 1}">More</choice> </xsl:if> </select> </card> </xsl:template> These templates have been tested and work in SAXON given your output. I hope that helps, Jeni Dr Jeni Tennison Epistemics Ltd * Strelley Hall * Nottingham * NG8 6PE tel: 0115 906 1301 * fax: 0115 906 1304 * email: jeni.tennison@xxxxxxxxxxxxxxxx XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Capturing element nodes which look , Medina, Edward | Thread | Re: XSL to popolate Popup Navigator, Jeni Tennison |
Capturing element nodes which look , Medina, Edward | Date | RE: running msxml3 from command lin, Andrew Kimball |
Month |