Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > XML > XSLT with following-sibling

Reply
Thread Tools

XSLT with following-sibling

 
 
peter_hanzel@yahoo.com
Guest
Posts: n/a
 
      02-21-2007
Hello, I'am writing xslt transformation and want to achieve this.
I have this xml:

<Info>
<CtrlUnit>unit1</CtrlUnit>
<Freq>1</Freq>
<Freq>2</Freq>
<CtrlUnit>unit2</CtrlUnit>
<Freq>100</Freq>
</Info>

And I want to translate it to this:

<Info>
<CtrlUnit>unit1<x:br/>1<x:br/>2</CtrlUnit>
<CtrlUnit>unit2<x:br/>100</CtrlUnit>
</Info>

So to select following Freqs but only to next CtrUnit.
How can I achieve this?


I can't use XLST 2.0 with for-each-group. Only XSLT 1.1 is available

 
Reply With Quote
 
 
 
 
Martin Honnen
Guest
Posts: n/a
 
      02-21-2007
http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:
> Hello, I'am writing xslt transformation and want to achieve this.
> I have this xml:
>
> <Info>
> <CtrlUnit>unit1</CtrlUnit>
> <Freq>1</Freq>
> <Freq>2</Freq>
> <CtrlUnit>unit2</CtrlUnit>
> <Freq>100</Freq>
> </Info>
>
> And I want to translate it to this:
>
> <Info>
> <CtrlUnit>unit1<x:br/>1<x:br/>2</CtrlUnit>
> <CtrlUnit>unit2<x:br/>100</CtrlUnit>
> </Info>
>
> So to select following Freqs but only to next CtrUnit.
> How can I achieve this?


Here is an XSLT 1.0 example:

<xsl:stylesheet xmlnssl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml" version="1.0">

<xslutput method="xml" indent="yes"/>

<xsl:key name="unit-group" match="Freq"
use="generate-id(preceding-sibling::CtrlUnit[1])"/>

<xsl:template match="Info">
<xsl:copy>
<xsl:copy-of select="document('')/*/namespace:"/>
<xsl:apply-templates select="CtrlUnit"/>
</xsl:copy>
</xsl:template>

<xsl:template match="CtrlUnit">
<xsl:copy>
<xsl:value-of select="."/>
<xsl:apply-templates select="key('unit-group', generate-id())"/>
</xsl:copy>
</xsl:template>

<xsl:template match="Freq">
<x:br/><xsl:value-of select="."/>
</xsl:template>

</xsl:stylesheet>

Result applied to your input XML with Saxon 6.5 is

<Info xmlns="http://www.w3.org/1999/xhtml">
<CtrlUnit>unit1<x:br/>1<x:br/>2</CtrlUnit>
<CtrlUnit>unit2<x:br/>100</CtrlUnit>
</Info>


--

Martin Honnen
http://JavaScript.FAQTs.com/
 
Reply With Quote
 
 
 
 
p.lepin@ctncorp.com
Guest
Posts: n/a
 
      02-21-2007
On Feb 21, 3:52 pm, (E-Mail Removed) wrote:
> <Info>
> <CtrlUnit>unit1</CtrlUnit>
> <Freq>1</Freq>
> <Freq>2</Freq>
> <CtrlUnit>unit2</CtrlUnit>
> <Freq>100</Freq>
> </Info>
>
> And I want to translate it to this:
>
> <Info>
> <CtrlUnit>unit1<x:br/>1<x:br/>2</CtrlUnit>
> <CtrlUnit>unit2<x:br/>100</CtrlUnit>
> </Info>
>
> So to select following Freqs but only to next CtrUnit.


First of all, apply your evil-removal tool (I favour
shovels) to whoever designed that XML.

<Info>
<CtrlUnit name="unit1">
<Freq>1</Freq>
<Freq>2</Freq>
</CtrlUnit>
<CtrlUnit name="unit2">
<Freq>100</Freq>
</CtrlUnit>
</Info>

Is way more logical, and you wouldn't have to face your
present problems if it was designed that way from the
start.

> How can I achieve this?


However, since it is possible that you have no power over
your source XML's structure, and since grouping problems
are sometimes unavoidable anyway, here's a way to do this:

<xsl:stylesheet version="1.0"
xmlnssl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="ctrl-unit" match="Freq"
use="generate-id(preceding-sibling::CtrlUnit[1])"/>
<xsl:template match="Info">
<xsl:copy>
<xsl:apply-templates select="CtrlUnit"/>
</xsl:copy>
</xsl:template>
<xsl:template match="CtrlUnit">
<xsl:copy>
<xsl:apply-templates/>
<xsl:apply-templates
select="key('ctrl-unit',generate-id(.))"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Freq">
<br/>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>

Google XSL FAQ, it has a lot of highly useful info on
grouping, as well as about a zillion other problems.

--
Pavel Lepin

 
Reply With Quote
 
peter_hanzel@yahoo.com
Guest
Posts: n/a
 
      02-21-2007
Oki thanks a lot. That thing with xsl:key is new for me.

(E-Mail Removed) napísal(a):
> Hello, I'am writing xslt transformation and want to achieve this.
> I have this xml:
>
> <Info>
> <CtrlUnit>unit1</CtrlUnit>
> <Freq>1</Freq>
> <Freq>2</Freq>
> <CtrlUnit>unit2</CtrlUnit>
> <Freq>100</Freq>
> </Info>
>
> And I want to translate it to this:
>
> <Info>
> <CtrlUnit>unit1<x:br/>1<x:br/>2</CtrlUnit>
> <CtrlUnit>unit2<x:br/>100</CtrlUnit>
> </Info>
>
> So to select following Freqs but only to next CtrUnit.
> How can I achieve this?
>
>
> I can't use XLST 2.0 with for-each-group. Only XSLT 1.1 is available


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Including XSLT/XML document within a XSLT document dar_imiro@hotmail.com XML 4 12-13-2005 02:26 AM
Multiple XSLT Transforms using a Controller XSLT sneill@mxlogic.com XML 2 10-19-2005 11:00 AM
ANN: New low-cost XML Editor, XSLT Editor, XSLT Debugger, DTD/Schema Editor Stylus Studio Java 0 08-03-2004 03:53 PM
xslt alone or xslt/java for static site? ted XML 1 01-26-2004 10:41 AM
[XSLT]Passing values from Javascript to a XSLT variable Benjamin Hillsley XML 3 09-25-2003 04:50 AM



Advertisments