Subject: Re: [xsl] XSL question From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> Date: Thu, 28 Mar 2002 12:23:17 +0000 |
Hi Manoj, > The tag value "CLOSING CONDITIONS:" can appear as value of any of > the ConditionText tags, but after the "PRIOR CONDITIONS". The XSL > stylesheet should locate the "CLOSING CONDITIONS:" value, and insert > 3 new predefined fixed ConditionText nodes after that node. All the > remaining ConditionText nodes will show this change in the result > tree by having their count incremented as shown in the transformed > XML below: Crikey, that's a... *novel* XML structure. I think that the easiest thing to do is to have a template that matches all the ConditionTextN elements: <xsl:template match="*[starts-with(name(), 'ConditionText')]"> ... </xsl:template> Then you can test which kind of condition text it is, falling into three categories: - the ConditionTextN element whose value is "CLOSING CONDITIONS:" (in which case it should be copied and the three new elements inserted) - before the ConditionTextN element whose value is "CLOSING CONDITIONS:" (in which case it should get copied) - after the ConditionTextN element whose value is "CLOSING CONDITONS:" (in which case it should be copied, but with its index number increased by 3) You can have an xsl:choose to test which of the three conditions you fall into. You can test whether a node is before the "CLOSING CONDITIONS:" one by seeing if it has a following sibling whose value is "CLOSING CONDITIONS:": <xsl:template match="*[starts-with(name(), 'ConditionText')]"> <xsl:choose> <xsl:when test=". = 'CLOSING CONDITIONS:'"> ... </xsl:when> <xsl:when test="following-sibling::*[. = 'CLOSING CONDITIONS:']"> ... </xsl:when> <xsl:otherwise> ... </xsl:otherwise> </xsl:choose> </xsl:template> You need to be able to work out the index of the ConditionTextN element, obviously, which you can do by taking the substring after 'ConditionText' in the name: <xsl:variable name="index" select="substring-after(name(), 'ConditionText')" /> You can copy elements completely with xsl:copy-of, and create elements with new names using an attribute value template in the name attribute of the xsl:element instruction. For example, you can create the copies, with updated index, of the nodes following the 'CLOSING CONDITIONS:' element with the following: <xsl:element name="ConditionText{$index + 3}"> <xsl:copy-of select="node()" /> </xsl:element> So a template that you could use would be: <xsl:template match="*[starts-with(name(), 'ConditionText')]"> <xsl:variable name="index" select="substring-after(name(), 'ConditionText')" /> <xsl:choose> <xsl:when test=". = 'CLOSING CONDITIONS:'"> <xsl:copy-of select="." /> <xsl:element name="ConditionText{$index + 1}"> This is Standard Condition 1 </xsl:element> <xsl:element name="ConditionText{$index + 2}"> This is Standard Condition 2 </xsl:element> <xsl:element name="ConditionText{$index + 3}"> This is Standard Condition 3 </xsl:element> </xsl:when> <xsl:when test="following-sibling::*[. = 'CLOSING CONDITIONS:']"> <xsl:copy-of select="." /> </xsl:when> <xsl:otherwise> <xsl:element name="ConditionText{$index + 3}"> <xsl:copy-of select="node()" /> </xsl:element> </xsl:otherwise> </xsl:choose> </xsl:template> Cheers, Jeni --- Jeni Tennison http://www.jenitennison.com/ XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] XSL question, Manoj Jha | Thread | [xsl] How do I suppress a namespace, David Penton |
Re: [xsl] XSD Quick HOWTO, Francis Norton | Date | [xsl] narrow down a selecting, Joeri Belis |
Month |