|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: Convert sequence of elements to nested structure
Hi Rowan,
Please try this XSL -
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/root">
<root>
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test="name(.) != 'note'">
<xsl:copy-of select="." />
</xsl:when>
<xsl:when test="name(preceding-sibling::*[1])
!= 'note'">
<note>
<xsl:value-of select="." />
<xsl:call-template name="create-group">
<xsl:with-param name="node-set"
select="following-sibling::*" />
</xsl:call-template>
</note>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</root>
</xsl:template>
<xsl:template name="create-group">
<xsl:param name="node-set" />
<xsl:choose>
<xsl:when test="(name($node-set[1]) = 'note') and
(name($node-set[2]) != 'note')">
<cont><xsl:value-of select="$node-set[1]"
/></cont>
</xsl:when>
<xsl:when test="(name($node-set[1]) = 'note') and
(name($node-set[2]) = 'note')">
<cont><xsl:value-of select="$node-set[1]"
/></cont>
<xsl:call-template name="create-group">
<xsl:with-param name="node-set"
select="$node-set[position() > 1]" />
</xsl:call-template>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
When it is applied to XML -
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a>content1</a>
<note>content2</note>
<note>content3</note>
<note>content4</note>
<b>content5</b>
</root>
It produces o/p -
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a>content1</a>
<note>content2
<cont>content3</cont>
<cont>content4</cont>
</note>
<b>content5</b>
</root>
I wish all XSL-List members Merry Christmas and a
Happy New Year!
Regards,
Mukul
--- Rowan Bradley <rowan.bradley@xxxxxxxxxxxxxxxx>
wrote:
> Hi,
>
> This is no doubt an elementary question but I need
> to convert a sequence
> of elements of the same name like this:
>
> <a>content1</a>
> <note>content2</note>
> <note>content3</note>
> <note>content4</note>
> <b>content5</b>
>
> into a nested structure like this:
>
> <a>content1</a>
> <note>content2
> <cont>content3</cont>
> <cont>content4</cont>
> </note>
> <b>content5</b>
>
> In other words, if there are consecutive <note>
> elements, they should be
> combined into one <note> element with the 2nd, 3rd
> and subsequent lines
> expressed as <cont> (continuation line) elements
> within the <note> element.
>
> I can't quite see how to do this by recursion.
>
> Thanks for your help
>
> Rowan
__________________________________
Do you Yahoo!?
Dress up your holiday email, Hollywood style. Learn more.
http://celebrity.mail.yahoo.com
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








