|
Subject: Re: [xsl] Need to Split/Un-Nest elements From: "Mandar Jagtap" <mandar.jagtap@xxxxxxxxx> Date: Tue, 17 Jun 2008 16:16:23 +0530 |
Hi Andrew,
I am not sure if you got chance to take a look my last post in the
thread so describing the same again as below:
Thanks for the response and stylesheet too...It's working well with me
but with one limitation. In the input xml, I can't be sure about that
how many nested block level elements would be there inside <page> i.e.
descendants of <page> can be many nested <block> elements and also they
can be <list>, <table> etc. I tried using <xsl:template match="*"
mode='copy'> instead of <xsl:template match="inline" mode="copy"> in the
stylesheet but in that case it doesn't copy parent elements of original
<inline> or <block> from original <page> element to newly generated
(replicated) <page>. i.e. as per example below, it doesn't copy the 3
nested <block> elements in the replicated <page> element. Could you
please suggest on this?
Current Input XML:
<?xml version='1.0'?>
<region>
<page>
<block>Text1.....</block>
<block>
<block>
<block>
<inline>Text2.....</inline>
<table>
<cell>cell1.....</cell>
<cell>cell2.....</cell>
</table>
<page>
<block>Text3.....</block>
</page>
<list>
<item1>Text4......</item1>
<item2>Text5......</item2>
</list>
</block>
</block>
</block>
</page>
<page>
<block>Text5.....</block>
</page>
</region>
Current Output using <xsl:template match="*" mode="copy">:
<?xml version="1.0" encoding="UTF-8"?>
<region>
<page>
<block>Text1.....</block>
<block>
<block>
<block>
<inline>Text2.....</inline>
<table>
<cell>cell1.....</cell>
<cell>cell2.....</cell>
</table>
</block>
</block>
</block>
</page>
<page>
<block>Text3.....</block>
</page>
<page>
<list>
<item1>Text4......</item1>
<item2>Text5......</item2>
</list>
</page>
<page>
<block>Text5.....</block>
</page>
</region>
Stylesheet:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()[1]"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="@*">
<xsl:copy/>
</xsl:template>
<xsl:template match="/region">
<xsl:copy>
<xsl:apply-templates
select="//page|//*[preceding-sibling::*[1][self::page]]" mode="copy"/>
</xsl:copy>
</xsl:template>
<xsl:template match="page" mode="copy">
<xsl:copy>
<xsl:apply-templates select="node()[1]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*" mode="copy">
<page>
<xsl:apply-templates select="."/>
</page>
</xsl:template>
<xsl:template match="page"/>
</xsl:stylesheet>
Thanks & Regards
Mandar
On 6/12/08, Andrew Welch <andrew.j.welch@xxxxxxxxx> wrote:
> 2008/6/12 Mandar Jagtap <mandar.jagtap@xxxxxxxxx>:
> > Hi,
> >
> > I want to split/un-nest the elements in xml like below:
> >
> > Input xml:
> >
> > <region>
> > <page>
> > <block>Text1.....</block>
> > <block>
> > <inline>Text2.....</inline>
> > <page>
> > <block>Text3.....</block>
> > </page>
> > <inline>Text4......</inline>
> > </block>
> > </page>
> > <page>
> > <block>Text5.....</block>
> > </page>
> > </region>
> >
> > Desired Output:
> >
> > <region>
> > <page>
> > <block>Text1.....</block>
> > <block>
> > <inline>Text2.....</inline>
> > </block>
> > </page>
> > <page>
> > <block>Text3.....</block>
> > </page>
> > <page>
> > <block>
> > <inline>Text4......</inline>
> > </block>
> > </page>
> > <page>
> > <block>Text5.....</block>
> > </page>
> >
> > </region>
> >
> > Can anyone help me on this?
>
>
> You need the "modified identity" or "sibling recursion" technique to
> allow you stop processing as you come across a <page> element:
>
>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
> <xsl:output indent="yes"/>
>
> <xsl:template match="node()">
> <xsl:copy>
> <xsl:apply-templates select="@*|node()[1]"/>
> </xsl:copy>
> <xsl:apply-templates select="following-sibling::node()[1]"/>
> </xsl:template>
>
> <xsl:template match="@*">
> <xsl:copy/>
> </xsl:template>
>
> <xsl:template match="/region">
> <xsl:copy>
> <xsl:apply-templates
> select="//page|//*[preceding-sibling::*[1][self::page]]" mode="copy"/>
> </xsl:copy>
> </xsl:template>
>
> <xsl:template match="page" mode="copy">
> <xsl:copy>
> <xsl:apply-templates select="node()[1]"/>
> </xsl:copy>
> </xsl:template>
>
> <xsl:template match="inline" mode="copy">
> <page>
> <block>
> <xsl:apply-templates select="."/>
> </block>
> </page>
> </xsl:template>
>
> <xsl:template match="page"/>
>
> </xsl:stylesheet>
>
>
> Sorry I don't have time to explain it...
>
>
> --
> Andrew Welch
> http://andrewjwelch.com
> Kernow: http://kernowforsaxon.sf.net/
>
>
--
Thanks & Regards,
Mandar
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl] Need to Split/Un-Nest ele, mandar.jagtap | Thread | Re: [xsl] Need to Split/Un-Nest ele, Andrew Welch |
| Re: [xsl] Check the last character , David Carlisle | Date | [xsl] Group nodes, IZASKUN GUTIERREZ GU |
| Month |