Subject: RE: [xsl] complex numbering problem From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Fri, 12 Dec 2008 16:03:28 -0000 |
It looks to me like this: <xsl:for-each select="//event"> <xsl:sort select="@start" data-type="number"/> <time_slot time_slot_id="ts{position()}" time_value="{@start}"/> </xsl:for-each> Or have I missed something? Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: Alexander Koenig [mailto:Alexander.Koenig@xxxxxx] > Sent: 12 December 2008 15:53 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] complex numbering problem > > Hi all, > > I'm fairly new to XSL but after a couple of hours of googling > and thinking about how to structure my xsl file differently I > came here in the hope that someone can help me not using > saxon:assign (I already learned that this would be a bad > thing - but to be honest, I also cannot get it to work with > my Oxygen 9.3 ;-) > > I'm using Oxygen 9.3 under SuSE Linux 10.0. XSL 1.0, Saxon 6.5.5 > > The problem is as follows: I want to transform one kind of > XML files into another kind using XSLT. > > This is how (the relevant part of) my source file looks like: > > <root> > <layer l-id="l01"> > <meta m-id="m01"> > <desc><name>layer-interpretation</name><val>abc</val></desc> > <desc><name>layer-type</name><val>some_type</val></desc> > </meta> > <event e-id="l01-001" start="0" end="17.499806"/> <event > e-id="l01-002" start="17.499806" end="17.524455">XYZ</event> > <event e-id="l01-003" start="17.524455" > end="113.487545">XYZ</event> <event e-id="l01-004" > start="113.487545" end="113.554857">XYZ</event> <event > e-id="l01-005" start="113.554857" end="113.94197">XYZ</event> > <event e-id="l01-006" start="113.94197" > end="114.1085">XYZ</event> </layer> <layer l-id="l02"> <meta > m-id="m02"> > <desc><name>layer-interpretation</name><val>xyz</val></desc> > <desc><name>layer-type</name><val>some_other_type</val></desc> > </meta> > <event e-id="l02-001" start="0" end="17.7997">XYZ</event> > <event e-id="l02-002" start="17.7997" > end="112.409813">XYZ</event> <event e-id="l02-003" > start="112.409813" end="112.763921">XYZ</event> <event > e-id="l02-004" start="112.763921" > end="113.570947">XYZ</event> </layer> <!--some more layers--> </root> > > This is how I want my target file to look like: > > <time_order> > <time_slot time_slot_id="ts1" time_value="0"/> > <time_slot time_slot_id="ts2" time_value="0"/> > <time_slot time_slot_id="ts3" time_value="17.499806"/> > <time_slot time_slot_id="ts4" time_value="17.524455"/> > <time_slot time_slot_id="ts5" time_value="17.7997"/> > <time_slot time_slot_id="ts6" time_value="112.409813"/> > <time_slot time_slot_id="ts7" time_value="112.763921"/> > <time_slot time_slot_id="ts8" time_value="113.487545"/> > <time_slot time_slot_id="ts9" time_value="113.554857"/> > <time_slot time_slot_id="ts10" time_value="113.570947"/> > <time_slot time_slot_id="ts11" time_value="113.94197"/> > <time_slot time_slot_id="ts12" time_value="114.1085"/> > </time_order> > > That means, I want every time index (even duplicates, because > I need them later on) in a separate time_slot element. The > time_slot elements should be sorted by the time_value in > ascending order and should get a unique id, also in ascending > order. I just cannot get the XSL structured in such a way > that both attributes are in order. It's always one or the > other, but never both. Or when I get both in order, I have > duplicate time_slot_id's instead. > > My latest attempt looks like this: > > <xsl:template match="event" mode="timeslots"> > <time_slot> > <xsl:attribute name="time_slot_id"> > <xsl:text>ts</xsl:text> > <xsl:number level="any" value="position()"/> > </xsl:attribute> > <xsl:attribute name="time_value"> > <xsl:value-of select="@start"/> > </xsl:attribute> > </time_slot> > <xsl:if test="count(following-sibling::event)=0"> > <time_slot> > <xsl:attribute name="time_slot_id"> > <xsl:text>ts</xsl:text> > <xsl:number level="any" value="position()"/> > </xsl:attribute> > <xsl:attribute name="time_value"> > <xsl:value-of select="@end"/> > </xsl:attribute> > </time_slot> > </xsl:if> > </xsl:template> > > With this, both attributes are (almost, but not quite - why?) > in order, but I get duplicate IDs for the "end" attributes. > The result looks like > this: > > <time_order> > ... > <time_slot time_slot_id="ts1727" time_value="113.487545"/> > <time_slot time_slot_id="ts1728" time_value="113.554857"/> > <time_slot time_slot_id="ts1729" time_value="113.570521"/> > <time_slot time_slot_id="ts1729" > time_value="114.10741400000001"/> <time_slot > time_slot_id="ts1730" time_value="113.791077"/> <time_slot > time_slot_id="ts1730" time_value="114.10859000000001"/> > <time_slot time_slot_id="ts1731" > time_value="113.94197699999999"/> <time_slot > time_slot_id="ts1731" time_value="114.10859000000001"/> </time_order> > > The only idea I have to fix this, is a variable which I > increase every time I enter the if block and which is added > to position() to form the ID. But XSL has no variables and so > I'm kind of stuck. > > I hope one of the XSL experts out there can help me. > > kind regards > Alex
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] complex numbering problem, Alexander Koenig | Thread | Re: [xsl] complex numbering problem, Mukul Gandhi |
[xsl] complex numbering problem, Alexander Koenig | Date | Re: [xsl] complex numbering problem, Mukul Gandhi |
Month |