[xsl] use preceding element or self

Subject: [xsl] use preceding element or self
From: "Klocker Christoph" <Christoph.Klocker@xxxxxxxxxxxxx>
Date: Thu, 28 Apr 2005 17:05:29 +0200
Hi, 

Hi,
I got this XML and want to fill an element "kundenkategorie" with the capitalized word of par[@class='Komm_H3'] for each Norm1.

If there is no capitalized word, it should take the one of the preceding <Norm1>. 
If there is a new one it should, take this one. Couldn't figure it out how to do it.


<root>
	<Norm1>
		<part>
			<kategorie>Heft 1/2003</kategorie>
			<par class="Ref" xml:lang="de">
				<hidden>StInfo 2003/1</hidden>
			</par>
			<par class="Komm_H2" xml:lang="de">Verfassungswidrigkeit der Unfallrentenbesteuerung</par>
			<par class="Komm_H3" xml:lang="de">EINKOMMENSTEUER<linebreak/>
				<inline class="*Paragraph">B' 3 Abs 1 Z 4 lit c</inline>
				<inline class="*hidden"> EStG</inline>, <inline class="*Paragraph">B' 25 Abs 1 Z 1 lit c EStG</inline>
			</par>
		</part>
	</Norm1>
	<Norm1>
		<part>
			<kategorie>Heft 1/2003</kategorie>
			<par class="Ref" xml:lang="de">
				<hidden>StInfo2003/2</hidden>
			</par>
			<par class="Komm_H2" xml:lang="de">Verordnung C<ber die Kriterien zur Festlegung fC6rderbarer Forschungs- und Entwicklungsaufwendungen (-ausgaben)</par>
			<par class="Komm_H3" xml:lang="de">
				<inline class="*Paragraph">B' 4 Abs 4 Z 4a</inline>
				<inline class="*hidden"> EStG</inline>, <inline class="*Paragraph">B' 108c Abs 2 Z 1 EStG</inline>
			</par>
			<par class="Komm_normal" xml:lang="de">
				<inline class="*fett">BGBl II 2002/506, ausgegeben am 20. 12. 2002</inline>
			</par>
		</part>
	</Norm1>
	<Norm1>
		<part>
			<kategorie>Heft 1/2003</kategorie>
			<par class="Ref" xml:lang="de">
				<hidden>StInfo 2003/3</hidden>
			</par>
			<par class="Komm_H2" xml:lang="de">ForschungsfC6rderungsbeitrC$ge nicht Teil der Bemessungsgrundlage des Forschungsfreibetrages</par>
			<par class="Komm_H3" xml:lang="de">
				<inline class="*Paragraph">B' 4 Abs 4 Z 4</inline>
				<inline class="*hidden"> EStG</inline>, <inline class="*Paragraph">B' 20 Abs 2 EStG</inline>
			</par>
		</part>
	</Norm1>
	<Norm1>
		<part>
			<kategorie>Heft 1/2003</kategorie>
			<par class="Ref" xml:lang="de">
				<hidden>StInfo 2003/4</hidden>
			</par>
			<par class="Komm_H2" xml:lang="de">Steuerberatungskosten eines Landwirtes bei Gewinnermittlung nach DurchschnittssC$tzen</par>
			<par class="Komm_H3" xml:lang="de">
				<inline class="*Paragraph">B' 17</inline>
				<inline class="*hidden"> EStG</inline>, <inline class="*Paragraph">B' 18 Abs 1 Z 6 EStG</inline>
			</par>
		</part>
	</Norm1>
	<Norm1>
		<part>
			<kategorie>Heft 1/2003</kategorie>
			<par class="Ref" xml:lang="de">
				<hidden>StInfo 2003/5</hidden>
			</par>
			<par class="Komm_H2" xml:lang="de">Verfassungswidrigkeit der Leibrentenbewertung</par>
			<par class="Komm_H3" xml:lang="de">
				<inline class="*Paragraph">B' 29 Z 1 EStG</inline>, <inline class="*Paragraph">B' 16 Abs 2 BewG</inline>
			</par>
		</part>
	</Norm1>
	<Norm1>
		<part>
			<kategorie>Heft 1/2003</kategorie>
			<par class="Ref" xml:lang="de">
				<hidden>StInfo 2003/6</hidden>
			</par>
			<par class="Komm_H2" xml:lang="de">Cnderungen der Umsatzsteuerrichtlinien - Rechnungslegung aufgrund des 2. AbgabenC$nderungsgesetzes 2002</par>
			<par class="Komm_H3" xml:lang="de">UMSATZSTEUER</par>
			<par class="Komm_normal" xml:lang="de">
				<inline class="*fett">BMF 18. 12. 2002</inline>
			</par>
		</part>
	</Norm1>
<Norm1>
		<part>
			<kategorie>Heft 1/2003</kategorie>
			<par class="Ref" xml:lang="de">
				<hidden>StInfo 2003/5</hidden>
			</par>
			<par class="Komm_H2" xml:lang="de">Verfassungswidrigkeit der Leibrentenbewertung</par>
			<par class="Komm_H3" xml:lang="de">
				<inline class="*Paragraph">B' 29 Z 1 EStG</inline>, <inline class="*Paragraph">B' 16 Abs 2 BewG</inline>
			</par>
		</part>
	</Norm1>
	<Norm1>
		<part>
			<kategorie>Heft 1/2003</kategorie>
			<par class="Ref" xml:lang="de">
				<hidden>StInfo 2003/7</hidden>
			</par>
			<par class="Komm_H2" xml:lang="de">Verordnung betreffend die Vermeidung von Doppelbesteuerung</par>
			<par class="Komm_H3" xml:lang="de">BAO, DOPPELBESTEUERUNG</par>
		</part>
	</Norm1>
</root>

My 
Template:
<xsl:template match="Norm1[not(position()=1)]/part">
		<part>
			<kundenkategorie>
				
						<xsl:choose>

							<xsl:when test="count(parent::node()/preceding-sibling::Norm1) &lt; 2 or string-length(par[@class='Komm_H2']/following-sibling::par[1][@class='Komm_H3']/node()[1][self::text()]) > 8">
								<xsl:value-of select="par[@class='Komm_H3']/text()[1]"/>
							</xsl:when>
							<xsl:otherwise>
								<xsl:value-of select="preceding::par[@class='Komm_H3'][string-length(normalize-space(text()[1])) > 8][1]/text()[1]"/>
							</xsl:otherwise>
						</xsl:choose>
						
					
			</kundenkategorie>
			<xsl:copy-of select="*"/>
		</part>

Current Thread