Altova Mailing List Archives


RE: [xsl] I only want to process the first node... ;)

From: "Geert Josten" <geert.josten@----------->
To:
Date: 9/18/2007 9:31:00 PM
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>&#xa;</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

Disclaimer

These Archives are provided for informational purposes only and have been generated directly from the Altova mailing list archive system and are comprised of the lists set forth on www.altova.com/list/index.html. Therefore, Altova does not warrant or guarantee the accuracy, reliability, completeness, usefulness, non-infringement of intellectual property rights, or quality of any content on the Altova Mailing List Archive(s), regardless of who originates that content. You expressly understand and agree that you bear all risks associated with using or relying on that content. Altova will not be liable or responsible in any way for any content posted including, but not limited to, any errors or omissions in content, or for any losses or damage of any kind incurred as a result of the use of or reliance on any content. This disclaimer and limitation on liability is in addition to the disclaimers and limitations contained in the Website Terms of Use and elsewhere on the site.