Subject: RE: [xsl] Re: How to show distinct node values? From: "Poort, J." <J.Poort@xxxxxxxxxxxx> Date: Thu, 24 Jul 2003 07:42:59 +0200 |
Thank you very much for your quick answer. Joek Poort -----Oorspronkelijk bericht----- Van: Dimitre Novatchev [mailto:dnovatchev@xxxxxxxxx] Verzonden: woensdag 23 juli 2003 22:22 Aan: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Onderwerp: [xsl] 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 XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Re: Measuring the (byte) , Koes, Derrick | Thread | [xsl] ? using xsl:number, waldron . Navix |
Re: [xsl] Converting &, >, <, ", an, Elizabeth Barham | Date | [xsl] ? using xsl:number, waldron . Navix |
Month |