|
Subject: RE: [xsl] Number of elements with a given attribute From: J L <jinlii@xxxxxxxxxxx> Date: Wed, 6 Jan 2010 01:51:12 +0000 |
I'm new to XSLT 2.0. I tried this example in Altova and couldn't get the
output below. I'm not sure if the input is wrong or my xsl is incorrect.
Thanks for your time!
> <verse>
> <part role=3D"a">...</part>
> <part role=3D"a">...</part>
> <part role=3D"b">...</part>
> </verse>
> <verse>
input xml:
<verses>
<role name="a">
<verse>...</verse>
<verse part="beginning">1</verse>
</role>
<role name="a">
<verse part="continuation">continuation 2</verse>
</role>
<role name="b">
<verse part="continuation">continuation 3</verse>
</role>
<role name="b">
<verse part="end">end</verse>
<verse>...</verse>
</role>
<role name="a">
<verse>...</verse>
<verse part="beginning">1</verse>
</role>
<role name="a">
<verse part="continuation">continuation 2</verse>
</role>
<role name="b">
<verse part="continuation">continuation 3</verse>
</role>
<role name="b">
<verse part="end">end</verse>
<verse>...</verse>
</role>
</verses>
xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:template match="verses">
<xsl:for-each-group select="*"
group-starting-with="role/verse[empty(@part)] | verse[@part='beginning']">
<xsl:variable name="verse-number" select="position()"/>
<verse>
<xsl:for-each select="current-group()">
<part role="parent::role/@name">
<xsl:copy-of select="node()"/>
</part>
</xsl:for-each>
</verse>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
> From: mike@xxxxxxxxxxxx
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Date: Fri, 18 Dec 2009 09:45:18 +0000
> Subject: RE: [xsl] Number of elements with a given attribute
>
>>
>> In a piece of theater, I have some verses that are split
>> between different roles.
>>
>> The other are tagged on the following model:
>> <role name='...'>
>> ...
>> <verse>...</verse>
>> <verse part="beginning">...</verse>
>> </role>
>> <role name='...'>
>> <verse part="continuation">...</verse> </role> <role name='...'>
>> <verse part="continuation">...</verse> </role> <role name='...'>
>> <verse part="end">...</verse>
>> <verse>...</verse>
>> ...
>> </role>
>>
>
>> I wish to have the count of preceding parts of verse from the
>> last beginning part.
>> Regards,
>
> A classic case of two overlapping hierarchies running over the same data.
> One of these hierarchies is represented directly in the XML tree structure,
> the other is represented indirectly. You want to perform an operation on
the
> "hidden" hierarchy, so it's best to invert the structure so the verse
> hierarchy becomes the primary one. That is, you want:
>
> <verse>
> <part role="a">...</part>
> <part role="a">...</part>
> <part role="b">...</part>
> </verse>
> <verse>
> ...
>
> which can be done like this:
>
> <xsl:for-each-group select="$verses"
> group-starting-with="verse[empty(@part)] | verse[@part='beginning']">
> <xsl:variable name="verse-number" select="position()"/>
> <verse>
> <xsl:for-each select="current-group()">
> <part role="parent::role/@name">
> <xsl:copy-of select="node()"/>
> </part>
> </xsl:for-each>
> </verse>
> </xsl:for-each-group>
>
> You now have each verse represented by a complete element, broken into
parts
> to show who speaks each part of the verse, and this makes it easy for
> example to number the parts of a verse as you have asked for.
>
> Regards,
>
> Michael Kay
> http://www.saxonica.com/
> http://twitter.com/michaelhkay
>
_________________________________________________________________
Hotmail: Powerful Free email with security by Microsoft.
http://clk.atdmt.com/GBL/go/171222986/direct/01/
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] counting with position(), Imsieke, Gerrit, le- | Thread | RE: [xsl] Number of elements with a, Michael Kay |
| Re: [xsl] Modern web site design wi, Eric J. Bowman | Date | RE: [xsl] Number of elements with a, Michael Kay |
| Month |