ugrás a tartalomhoz

Változók átvétele XSL-ben

e107lac · 2006. Júl. 27. (Cs), 12.49
Az lenne a kérdésem, hogy xsl-ben miképpen tudom felhasználni egy templateben használt változót egy másik templatehez.
 
1

Paraméterként

Rici · 2006. Júl. 27. (Cs), 17.43
Paraméterként kell átadni a másik template-nek.

Más módszer nincs, az XSL deklaratív nyelv, a változók valójában inkább konstansok, amiknek létrehozásukkor megváltoztathatatlanul rögzül az értékük.

Még esetleg globális változókról lehet szó, de ezeket template nem állíthatja elő, ezeknek is deklarálásukkor definiálni kell az értéküket (ami persze függhet a forrás XML-től). De minden bizonnyal a te esetedben a template állítja elő a változót, így az nem lehet globális.
2

próbálkoztam azzal is

e107lac · 2006. Júl. 27. (Cs), 20.14
Igen azzal is próbálkoztam csak valahogyan nem akarja az igazat.

<xsl:template match="Heading_2">
<xsl:call-template name=heading-hid">
<xsl:with-param name="h2_num" value="concat($h1_num, substring-before(normalize-space(.),'. '))"/>
</xsl:call-template>
</xsl:template>

<xsl:template name="heading-hid">
<xsl:param name="h2_num"/>
<xsl:param name="h3_num">
<xsl:element name="chapter">
<xsl:attribute name="num"><xsl:value-of select="concat($h2_num, $h3_num)"/>
</xsl:element>
</xsl:template>

<xsl:template match="Heading_3">
<xsl:call-template name=heading-hid">
<xsl:with-param name="h3_num" value="substring-before(normalize-space(.),'. ')"/>
</xsl:call-template
</xsl:template>

Nagyjából ez lenne a kód csak az a baj vele hogy nem nagyon veszi át a h2_num értékét. Lehet hogy rosszul alkalmazom?
3

Az attribútum neve: select

Rici · 2006. Júl. 27. (Cs), 23.40
Az xsl:with-param taghez érvénytelen a value attribútum, select nevű attribútumban kell megadni a paraméter értékét.

Amúgy milyen XSL értelmezőt használsz? Mert egy ilyen hibát egy jobbféle XSL értelmező már fordítási időben kijelez. A kódodban szereplő hiányzó záró tagekről és egyéb XML hibákról nem is beszélve.
4

tényleg rossz

Anonymous · 2006. Júl. 28. (P), 09.53
Igen azt elrontottam, fáradt voltam :), ezt a kódot csak rögtönöztem azért hibás, de amúgy müködik, a fordító sem száll el hibával. nagyjából ez generáálódik belőle

<chapter num="12.2" level="2"><title>Heading2cime</title></chapter>
<chapter num="12.2." level="3"><title/></chapter>
<chapter num=".1" level="3"><title>Heading3cime</title></chapter>
<chapter num=".2" level="3"><title>Heading3cime</title></chapter>
<chapter num="12.3" level="2"><title>Heading2cime</title></chapter>
<chapter num="12.3." level="3"><title/></chapter>
<chapter num=".1" level="3"><title>Heading3cime</title></chapter>
Ezzel az a baj hogy ha megtalálja a Heading_2-t, azt szépen megcsinálja mint 2 szintű chapter, utána csinál egy 3-as szintűt, ahol még átveszi a Heading2-ből megkapott num értékét, de a Heading_3 num-jét már nem és a címét sem. Utána ugye megy tovább ahol pedig Heading3 van ott mindent szépen legenerál kivéve hogy nem kapja meg a Heading_2-ből átvett num értékét. Lehet hogy ez már nem megoldható XSl-ben?
5

Forrás XML, leforduló XSL

Rici · 2006. Júl. 28. (P), 11.17
XSL-ben minden megoldható, ha úgy tetszik, az XSL Turing-teljes. Persze ez csak elméleti jelentőségű, sokminden van, amire nem célszerű használni :D.

Viszont hogy a lényegre is reagálni tudjak, jó lenne mellékelni a kapott XML mellé a forrás XML-t és a helyesen leforduló XSL-t is. Anélkül hiába is próbálna bárki segíteni, csak a sötétben tapogatózna.
6

forrás+eredmény

e107lac · 2006. Júl. 28. (P), 14.13
forrás xml, csak a lényeget rakom be nem szeretném nagyon széthúzni ezzel a fórumot

<Heading_1>
1.  Útmutató
</Heading_1>
<Heading_2>
1.1.  Cím
</Heading_2>
<Heading_2>
1.2.  Cím
</Heading_2>
<Heading_3>
1.2.1.  Cím
</Heading_3>
<Heading_3>
1.2.2.  Cím
</Heading_3>
<Heading_2>
1.3.  Cím
</Heading_2>
<Heading_3>
1.3.1.  Cím
</Heading_3>
<Heading_1>
2.  Cím
</Heading_1>
<Heading_2>
2.1  Cím
</Heading_2>
Ezt transzformálnám át ezzel az xslt-el

<xsl:template match="Heading_2">
	<xsl:variable name="h2count"><xsl:number format="1" count="Heading_2"/></xsl:variable>
	<xsl:variable name="h1_num">
		<xsl:choose>
			<xsl:when test="$h2count &gt; 19">9</xsl:when>
			<xsl:otherwise>8</xsl:otherwise>
		</xsl:choose>
	</xsl:variable>
	
	<xsl:variable name="h2_num">
		<xsl:choose>
			<xsl:when test="$h2count &gt; 19">
				<xsl:value-of select="$h2count - 19"/>   
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="$h2count"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:variable> 
	<xsl:text disable-output-escaping="yes">&lt;/chapter&gt;</xsl:text>
	<xsl:text disable-output-escaping="yes">&lt;chapter level="2</xsl:text>
	<xsl:call-template name="h3">
		<xsl:with-param name="h2_numera" select="concat($h1_num,'.',$h2_num)"/>
		<xsl:with-param name="head_title" select="current()"/>
	</xsl:call-template>
</xsl:template>

<xsl:template name="h3">
	<xsl:param name="h2_numera"/>
	<xsl:param name="h3_num"/>
	<xsl:param name="head_title"/>    
	<xsl:text disable-output-escaping="yes">" o-num="</xsl:text>
	<xsl:value-of select="concat($h2_numera,$h3_num)"/>
	<xsl:text disable-output-escaping="yes">" o-num-display="NO</xsl:text>
	<xsl:text disable-output-escaping="yes">"&gt;</xsl:text>
	<xsl:element name="title">
		<xsl:value-of select="$head_title"/>
	</xsl:element>     
</xsl:template>

<xsl:template match="Heading_3"> 
	<xsl:variable name="h3" select="concat('.',translate(substring-before(normalize-space(.),'. '),'/','.'))"></xsl:variable> 
	
	<xsl:text disable-output-escaping="yes">&lt;/chapter&gt;</xsl:text>
	<xsl:text disable-output-escaping="yes">&lt;chapter level="3</xsl:text>
	<xsl:call-template name="h3">
		<xsl:with-param name="head_title" select="substring-after(normalize-space(.),'. ')"/>
		<xsl:with-param name="h3_num"><xsl:value-of select="$h3"/></xsl:with-param>
	</xsl:call-template>     
</xsl:template> 
ebből pedig kapok egy ilyen xmlt
<chapter level="1" o-num="1" o-num-display="NO">
<title>
Útmutató
</title>
</chapter>
<chapter level="2" o-num="1.1" o-num-display="NO">
<title>Cím</title>
</chapter>
<chapter level="2" o-num="1.2" o-num-display="NO">
<title>Cím</title>
</chapter>
<chapter level="3" o-num=".1" o-num-display="NO">
<title>Cím</title>
</chapter>
<chapter level="3" o-num=".2" o-num-display="NO">
<title>Cím</title>
<chapter level="2" o-num="1.3" o-num-display="NO">
<title>Cím</title>
</chapter>
<chapter level="3" o-num=".1" o-num-display="NO">
<title>Cím</title>
</chapter>
<chapter level="1" o-num="3" o-num-display="NO">
<title>Cím</title>
</chapter>
<chapter level="2" o-num="3.1" o-num-display="NO">
<title>Cím</title>
</chapter>
ez már igy tök jó lenne, csak nem tudom rávenni hogy a level3 chapternél az h3_num-ot összefüzze a h2_numera-val
7

Nem adod át a paramétert

Rici · 2006. Júl. 28. (P), 15.14
Amikor a Heading_3 template-ből meghívod a h3 templatet, akkor nem adsz értéket a h2_numera paraméternek, így nem is kell azon csodálkozni, hogy a h3 template futásakor a h2_numera értéke egy üres sztring lesz. (Ez csak egy hiba, ami most feltűnt, nem biztos, hogy ezt kijavítva minden működni fog.)

Amúgy az XSL kódodban több tervezési hiba is van, amitől persze működhet, de pl. az alábbi típusú dolgokat egyértelműen kerülni kellene:

<xsl:text disable-output-escaping="yes">&lt;/chapter&gt;</xsl:text>
Az ilyenek arra utalnak, hogy még nem tudod megfelelően használni az XSL lehetőségeit, több problémát is "gány" módszerrel próbálsz megoldani, amikre valószínűleg létezne sokkal elegánsabb megoldás is.

Persze valahol el kell kezdeni, remélem a további problémák megoldása során egyre jobban át fogod látni az XSL szemléletét, és szebb módszereket fogsz alkalmazni.
8

Köszönöm!

Anonymous · 2006. Júl. 28. (P), 21.08
Elöször is köszönöm a segítséget, bár nem nagyon tudom hogyan fogom a Heading_3 ban megadni a Heading_2-ben meghatározott $h2_numera értékét, de próbálkozom ahogy azt eddig is tettem. A teljes xsl nem az én kezem műve, igy mindig csak egy adott problémánál próbálom szebbé tenni, igy ezzel is ezt teszem. Csak ide igy gyorsabb volt bemásolni. És persze tanulok, tanulok ezerrel :)
9

Kipróbáltam

Rici · 2006. Júl. 30. (V), 01.27
Kipróbáltam az általad küldött XSL kódot az általad küldött XML kódon, de nem azt kaptam, amit te kaptál, nálam számok is szerepelnek a title tageken belül. Azon kívül a generált "XML" nehezen nevezhető XML-nek, mert a szabálytalan tag-létrehozási módszereknek köszönhetően előfordul olyan, hogy kezdőtag nélkül már zárótag jön. De ehhez igazából kipróbálni sem kell, ez ránézésre is látszik.

Én nem fogok könyörögni, hogy tényleg azt küldd el, ami nálad van. Azonkívül úgy érzem, hogy a te megoldásod már nagyon elment rossz irányba ahhoz, hogy jól ki lehessen javítani. Így is sokkal több időt szántam a dologra, mint eredetileg terveztem. Bocs, de nem fogom helyetted megoldani.

Annyit tudok hozzátenni, ahogy látom, ha 3-as szintű címről van szó, akkor az első három . előtti rész a fejezet sorszáma, ezt három substring-before függvénnyel és összefűzésekkel tudod kiszedni, ha így akarod megoldani a dolgot.