|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: How to show distinct node values?
Just using the good ole Muenchian method for grouping we have:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="kActScene" match="SCENE"
use="concat(../TITLE, '|', TITLE)"/>
<xsl:key name="kSpeaker" match="SPEAKER"
use="concat(generate-id(ancestor::ACT[1]),
'|',
generate-id(ancestor::SCENE[1])
)"/>
<xsl:key name="kSpkScene" match="SPEAKER"
use="concat(generate-id(ancestor::ACT[1]),
'|',
generate-id(ancestor::SCENE[1]),
'|',
.
)"/>
<xsl:key name="kSpkLine" match="LINE"
use="concat(generate-id(ancestor::ACT[1]),
'|',
generate-id(ancestor::SCENE[1]),
'|',
preceding-sibling::SPEAKER[1]
)"/>
<xsl:template match="/">
<xsl:for-each
select="PLAY/ACT/SCENE
[generate-id()
=
generate-id(key('kActScene',
concat(../TITLE, '|', TITLE)
)[1]
)
]">
<xsl:value-of
select="concat('
',
../TITLE,
'	',
substring-before(TITLE, '.'),
'
'
)"/>
<xsl:variable name="vidScene" select="generate-id()"/>
<xsl:variable name="vidAct" select="generate-id(..)"/>
<xsl:for-each
select="key('kSpeaker',
concat($vidAct,
'|',
$vidScene
)
)
[generate-id(.)
=
generate-id(key('kSpkScene',
concat($vidAct,
'|',
$vidScene,
'|',
.
)
)[1]
)
]">
<xsl:value-of
select="concat('		',
.,
'	',
count(key('kSpkLine',
concat($vidAct,
'|',
$vidScene,
'|',
.
)
)
),
'
')"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
When the above transformation (89 lines of code, which could be cut in half
in case I were not writing well-indented code) is applied on the file:
http://www.andrew.cmu.edu/user/akj/shakespeare/r_and_j.xml (5985 lines)
The wanted result is produced for 84.08 milliseconds (using MSXML4 on a
1.7GHz Pentium with 256MB RAM):
ACT I SCENE I
SAMPSON 31
GREGORY 20
ABRAHAM 5
BENVOLIO 51
TYBALT 5
First Citizen 2
CAPULET 3
LADY CAPULET 1
MONTAGUE 28
LADY MONTAGUE 3
PRINCE 23
ROMEO 66
ACT I SCENE II
CAPULET 34
PARIS 4
Servant 18
BENVOLIO 20
ROMEO 27
ACT I SCENE III
LADY CAPULET 37
Nurse 61
JULIET 8
Servant 4
ACT I SCENE IV
ROMEO 34
BENVOLIO 13
MERCUTIO 73
ACT I SCENE V
First Servant 9
Second Servant 5
CAPULET 56
Second Capulet 3
ROMEO 28
Servant 1
TYBALT 17
JULIET 19
Nurse 15
BENVOLIO 1
ACT II SCENE I
ROMEO 2
BENVOLIO 9
MERCUTIO 34
ACT II SCENE II
ROMEO 87
JULIET 115
Nurse 2
ACT II SCENE III
FRIAR LAURENCE 72
ROMEO 25
ACT II SCENE IV
MERCUTIO 88
BENVOLIO 13
ROMEO 46
Nurse 46
PETER 6
NURSE 9
ACT II SCENE V
JULIET 44
Nurse 36
ACT II SCENE VI
FRIAR LAURENCE 18
ROMEO 12
JULIET 7
ACT III SCENE I
BENVOLIO 53
MERCUTIO 66
TYBALT 14
ROMEO 36
First Citizen 4
PRINCE 16
LADY CAPULET 11
MONTAGUE 3
ACT III SCENE II
JULIET 116
Nurse 31
ACT III SCENE III
FRIAR LAURENCE 87
ROMEO 70
Nurse 22
ACT III SCENE IV
CAPULET 31
PARIS 4
LADY CAPULET 2
ACT III SCENE V
JULIET 105
ROMEO 24
Nurse 25
LADY CAPULET 37
CAPULET 64
ACT IV SCENE I
FRIAR LAURENCE 56
PARIS 23
JULIET 48
ACT IV SCENE II
CAPULET 26
Second Servant 5
Nurse 2
JULIET 12
LADY CAPULET 1
LADY CAPULET 2
ACT IV SCENE III
JULIET 56
LADY CAPULET 3
ACT IV SCENE IV
LADY CAPULET 3
Nurse 4
CAPULET 21
First Servant 1
Second Servant 2
ACT IV SCENE V
Nurse 28
LADY CAPULET 13
CAPULET 28
FRIAR LAURENCE 25
PARIS 6
First Musician 9
PETER 27
Second Musician 4
Musician 1
Third Musician 1
ACT V SCENE I
ROMEO 72
BALTHASAR 11
Apothecary 7
ACT V SCENE II
FRIAR JOHN 13
FRIAR LAURENCE 17
ACT V SCENE III
PARIS 33
PAGE 9
ROMEO 83
BALTHASAR 21
FRIAR LAURENCE 76
JULIET 14
First Watchman 19
Second Watchman 1
Third Watchman 3
PRINCE 37
CAPULET 10
LADY CAPULET 5
MONTAGUE 10
As an exercise, one may sort these by speaker or by number of lines (within
a scene).
=====
Cheers,
Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL
"Poort, J." <J.Poort@xxxxxxxxxxxx> wrote in message
news:BA6D7ACFEC40074CB82F14CC17369E259D59CB@xxxxxxxxxxxxxxxxxxx
>
> Hello,
> I'm using a big XML file and want to transform the data by XSL
> I open the XML in IE 6.0 and say href="r_and_j.xslt".
> In r_and_j.xslt I enter the XSL-commands.
>
> The XML file contains the play Romeo and Juliet.
> I want now to show in a table for each ACT and each SCENE the names of the
SPEAKER
> and the number of LINES he has to speak.
> Problemn is that I'm not able to show the distinct node values for the
SPEAKER.
> I'm able to count the lines for the SPEAKERS.
> On your site I found solutions like
> <xsl:key name="speakers" match="SPEAKER" use="." />
> or
> <xsl:for-each select="./SPEAKER[not(.=preceding::speaker)]" />
> They don't work for me (at least I don't know how!)
>
> Please advise,
> Thanks,
>
> Joek Poort
>
> More info below:
> I get :
> Speakers number lines
> ACT I SCENE I SAMPSON 10
> GREGORY 8
> SAMPSON 10
> GREGORY 8
> SAMPSON 10
> GREGORY 8
> SAMPSON 10
> GREGORY 8
> SAMPSON 10
> GREGORY 8
> SAMPSON 10
> GREGORY 8
> ABRAHAM 24
> BALTASAR 12
> ABRAHAM 24
> BALTASAR 12
> ABRAHAM 24
> BALTASAR 12
> Etc.....
>
> I would like to get something like:
>
> Speakers number lines
> ACT I SCENE I SAMPSON 10
> GREGORY 8
> ABRAHAM 24
> BALTASAR 12
> BENVOLIO 6
> TYBALT 6
> PRINCE 9
> SCENE || SAMPSON 3
> ROMEO 23
> JULIA 2
> Servant 4
>
>
> Small Part of the XML is
> <?xml version="1.0" standalone="yes"?><?xml-stylesheet type="text/xsl"
href="r_and_j.xslt"?>
>
> <PLAY>
> <TITLE>The Tragedy of Romeo and Juliet</TITLE>
> <PLAYSUBT>ROMEO AND JULIET</PLAYSUBT>
> <ACT><TITLE>ACT I</TITLE>
> <SCENE><TITLE>SCENE I. Verona. A public place.</TITLE>
> <STAGEDIR>Enter SAMPSON and GREGORY, of the house of Capulet,
> armed with swords and bucklers</STAGEDIR>
> <SPEECH>
> <SPEAKER>SAMPSON</SPEAKER>
> <LINE>Gregory, o' my word, we'll not carry coals.</LINE>
> </SPEECH>
> <SPEECH>
> <SPEAKER>GREGORY</SPEAKER>
> <LINE>No, for then we should be colliers.</LINE>
> </SPEECH>
> <SPEECH>
> <SPEAKER>SAMPSON</SPEAKER>
> <LINE>I mean, an we be in choler, we'll draw.</LINE>
> </SPEECH>
> <SPEECH>
> <SPEAKER>GREGORY</SPEAKER>
> <LINE>Ay, while you live, draw your neck out o' the collar.</LINE>
> </SPEECH>
>
> <SPEECH>
> <SPEAKER>SAMPSON</SPEAKER>
> <LINE>'Tis all one, I will show myself a tyrant: when I</LINE>
> <LINE>have fought with the men, I will be cruel with the</LINE>
> <LINE>maids, and cut off their heads.</LINE>
> </SPEECH>
>
> <STAGEDIR>Enter ABRAHAM and BALTHASAR</STAGEDIR>
>
> <SPEECH>
> <SPEAKER>ABRAHAM</SPEAKER>
> <LINE>Do you bite your thumb at us, sir?</LINE>
> </SPEECH>
>
> <SPEECH>
> <SPEAKER>SAMPSON</SPEAKER>
> <LINE>I do bite my thumb, sir.</LINE>
> </SPEECH>
>
> <SPEECH>
> <SPEAKER>BENVOLIO</SPEAKER>
> <LINE>Part, fools!</LINE>
> <LINE>Put up your swords; you know not what you do.</LINE>
> </SPEECH>
> <STAGEDIR>Beats down their swords</STAGEDIR>
> <STAGEDIR>Enter TYBALT</STAGEDIR>
>
> <SPEECH>
> <SPEAKER>TYBALT</SPEAKER>
> <LINE>What, art thou drawn among these heartless hinds?</LINE>
> <LINE>Turn thee, Benvolio, look upon thy death.</LINE>
> </SPEECH>
>
> <SPEECH>
> <SPEAKER>BENVOLIO</SPEAKER>
> <LINE>I do but keep the peace: put up thy sword,</LINE>
> <LINE>Or manage it to part these men with me.</LINE>
> </SPEECH>
>
> <SPEECH>
> <SPEAKER>TYBALT</SPEAKER>
> <LINE>What, drawn, and talk of peace! I hate the word,</LINE>
> <LINE>As I hate hell, all Montagues, and thee:</LINE>
> <LINE>Have at thee, coward!</LINE>
> </SPEECH>
>
> <SPEECH>
> <SPEAKER>PRINCE</SPEAKER>
> <LINE>Rebellious subjects, enemies to peace,</LINE>
> <LINE>Profaners of this neighbour-stained steel,--</LINE>
> <LINE>Will they not hear? What, ho! you men, you beasts,</LINE>
> <LINE>That quench the fire of your pernicious rage</LINE>
> <LINE>With purple fountains issuing from your veins,</LINE>
> <LINE>On pain of torture, from those bloody hands</LINE>
> <LINE>Throw your mistemper'd weapons to the ground,</LINE>
> <LINE>And hear the sentence of your moved prince.</LINE>
> <LINE>Three civil brawls, bred of an airy word,</LINE>
> <LINE>By thee, old Capulet, and Montague,</LINE>
> <LINE>Have thrice disturb'd the quiet of our streets,</LINE>
> <LINE>And made Verona's ancient citizens</LINE>
> <LINE>Cast by their grave beseeming ornaments,</LINE>
> <LINE>To wield old partisans, in hands as old,</LINE>
> <LINE>Canker'd with peace, to part your canker'd hate:</LINE>
> <LINE>If ever you disturb our streets again,</LINE>
> </SPEECH>
> </ACT>
>
> </SCENE>
>
>
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|
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








