Subject: RE: [xsl] I only want to process the first node... ;) From: "Geert Josten" <geert.josten@xxxxxxxxxxx> Date: Tue, 18 Sep 2007 23:10:33 +0200 |
Hi Norman, Add a root template that only applies templates on the direct S child nodes of Analysis and on each first descendant S within each non-S direct child of Analysis. Something like: <xsl:template match="/"> <xsl:apply-templates select="Analysis/S | Analysis/*//S[1]" /> </xsl:template> Note: the union sort the S element to document order, and the [1] predicate does not result in just one S descendant (at least, that is the intention) Kind regards, Geert > Drs. G.P.H. Josten Consultant Daidalos BV Source of Innovation Hoekeindsehof 1-4 2665 JZ Bleiswijk Tel.: +31 (0) 10 850 1200 Fax: +31 (0) 10 850 1199 www.daidalos.nl KvK 27164984 De informatie - verzonden in of met dit emailbericht - is afkomstig van Daidalos BV en is uitsluitend bestemd voor de geadresseerde. Indien u dit bericht onbedoeld hebt ontvangen, verzoeken wij u het te verwijderen. Aan dit bericht kunnen geen rechten worden ontleend. > From: Norman Rosner [mailto:jeckyll@xxxxxxx] > Sent: dinsdag 18 september 2007 18:14 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] I only want to process the first node... ;) > > Hi there! > > I have an XML File that looks like this: > > > > <Analysis> > > > > ..... > > <S> > > <PPER id="s33_5" word="er" lemma="er" morph="3.Nom.Sg.Masc" > > trans="he"/> > > <VVFIN id="s33_4" word="verlange" lemma="verlangen" > > morph="3.Sg.Pres.Subj" > > trans="request"/> > > <NP> > > <PP> > > <APPR id="s33_6" word="vor" lemma="vor" morph="--" > > trans="over"/> > > <PIS id="s33_7" word="allem" lemma="alle" > > morph="Dat.Sg.Masc" trans="all"/> > > </PP> > > <CNP> > > <NN id="s33_8" word="Arbeitsmoral" > lemma="Arbeitsmoral" > > morph="Acc.Sg.Fem" > > trans="employee moral"/> > > <KON id="s33_9" word="und" lemma="und" morph="--" > > trans="and"/> > > <NP> > > <ADJA id="s33_10" word="ordentliches" > > lemma="ordentlich" morph="Pos.Acc.Sg.Neut" > > trans="proper"/> > > <NN id="s33_11" word="Auftreten" > lemma="auftreten" > > morph="Acc.Sg.Neut" > > trans="appearence"/> > > </NP> > > </CNP> > > </NP> > > <PP> > > <APPR id="s33_1" word="Von" lemma="von" morph="--" > > trans="of | from"/> > > <PPOSAT id="s33_2" word="seinen" lemma="sein" > > morph="Dat.Pl.*" trans="her"/> > > <NN id="s33_3" word="Beschdftigten" lemma="beschdftigter" > > morph="Dat.Pl.*" > > trans="employees"/> > > </PP> > > </S> > > <DL> > > <CS> > > <S> > > <NE id="s34_1" word="Perot" lemma="Perot" > > morph="Nom.Sg.Masc" trans="Perot"/> > > <VAFIN id="s34_2" word="sei" lemma="sein" > > morph="3.Sg.Pres.Subj" trans="would be"/> > > <NP> > > <ART id="s34_3" word="ein" lemma="ein" > > morph="Nom.Sg.Masc" trans="an"/> > > <ADJA id="s34_4" word="autoritdrer" > > lemma="autoritdr" morph="Pos.Nom.Sg.Masc" > > trans="authoritarian"/> > > <NN id="s34_5" word="Macher" lemma="Macher" > > morph="Nom.Sg.Masc" trans="wright"/> > > </NP> > > </S> > > <KON id="s34_7" word="und" lemma="und" morph="--" > > trans="and"/> > > <S> > > <NP> > > <PPOSAT id="s34_11" word="seine" lemma="sein" > > morph="Nom.Sg.Fem" trans="her"/> > > <NN id="s34_12" word="Schwdche" lemma="Schwdche" > > morph="Nom.Sg.Fem" > > trans="weakness"/> > > </NP> > > <VAFIN id="s34_9" word="sei" lemma="sein" > > morph="3.Sg.Pres.Subj" trans="would be"/> > > <ADV id="s34_10" word="auch" lemma="auch" > morph="--" > > trans="too"/> > > </S> > > </CS> > > <S> > > <NP> > > <ART id="s34_16" word="ein" lemma="ein" > > morph="Nom.Sg.Masc" trans="a"/> > > <NN id="s34_17" word="Manager" lemma="Manager" > > morph="Nom.Sg.Masc" trans="manager"/> > > </NP> > > <VVFIN id="s34_14" word="beschreibt" lemma="beschreiben" > > morph="3.Sg.Pres.Ind" > > trans="describes"/> > > <PPER id="s34_15" word="ihn" lemma="ihn" > > morph="3.Acc.Sg.Masc" trans="him"/> > > </S> > > </DL> > > </Analysis> > > So there's an Analysis node and several S nodes as siblings. > But there are also CS and DL nodes as siblings of the > Analysis node. What i want is: Capitalize the first character > of every @trans that occurs first in a S node and just print > the rest @trans as strings to sdtout ;) > > So thats what i wrote: > > > <?xml version="1.0" encoding="utf-8"?> > > > > <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/ > > Transform" > > xmlns:xlink="http://www.w3.org/1999/xlink" > > xmlns:mt="machine_translation" > > xmlns:xml="http://www.w3.org/XML/1998/namespace"> > > > > <xsl:output method="text" omit-xml-declaration="yes" > > standalone="yes" indent="no"/> > > > > <xsl:strip-space elements="*"/> > > > > > > <!-- Capitalize the first character of a given word --> > > <xsl:function name="mt:capitalize_first"> > > <xsl:param name="word"/> > > <xsl:variable name="converted_first_char" select="translate > > (substring($word,1,1),'abcdefghijklmnopqrstuvwxyz', > > 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/> > > <xsl:value-of select="concat($converted_first_char, substring > > ($word, 2, string-length($word)))"/> > > </xsl:function> > > > > <xsl:template match="S"> > > > > <xsl:variable name="terminals" select="descendant::*[count > > (child::*) = 0]"/> > > > > <xsl:value-of > select="mt:capitalize_first($terminals[1]/@trans)"/> > > > > <xsl:for-each select="$terminals[position() != 1]/@trans"> > > <xsl:text> </xsl:text> > > <xsl:value-of select="."/> > > </xsl:for-each> > > > > <xsl:text>
</xsl:text> > > > > > > </xsl:template> > > </xsl:stylesheet> > > But then i recognized that some S nodes can occur in a CS > or DL nodes, so i changed my XPath expression (descendant::*[count > (child::*) = 0]) to tis one: ((ancestor::*)[2])/descendant::*[count > (child::*) = 0] just to test if it works when i take the > ancestor node that comes directly after the Analysis node. It > works fine but the fact is that i get the strings printed 2 > or three times. In the example above it is: > > > Perot would be an authoritarian wright and her weakness > would be too a > > manager describes him Perot would be an authoritarian > wright and her > > weakness would be too a manager describes him Perot would be an > > authoritarian wright and her weakness would be too a > manager describes > > him > > > So i know why it is printed or processed three times: There a > three S nodes inside the DL node. And here's the point: If i > processed the first S node inside a DL or CS node i don't > want to process the following S nodes in that CS or DL node. > > I hope that somebody of you can help me and that somebody of > you understand the problem :) > > Thanks in advance > > norman
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] I only want to process th, G. Ken Holman | Thread | [xsl] Document() question, Kerry Kobashi |
Re: [xsl] I only want to process th, G. Ken Holman | Date | [xsl] Document() question, Kerry Kobashi |
Month |