ugrás a tartalomhoz

Táblázat generálása for-each-group függvénnyel

minczerl · 2007. Jún. 11. (H), 14.20
Van egy XML-em (Indesign által generált), ahol a táblázat generálásnál elakadtam, nem tudom milyen úton-módon tudom úgy csoportosítani az elemeket hogy a generált táblázatban megfelelően legyenek a rowspan és a colspan elemek. Jelen esetben úgy kell egy újabb tr elemet beszúrni ahol Cell elemek aid:ccols attribútumainak összege egyenlő a Table elem aid:tcols attribútumának értékével. Ha valakinek lenne valami hasznos ötlete ezügyben azt szívesen venném.
<?xml version="1.0" encoding="UTF-8"?>
<Table xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/" aid:table="table" aid:trows="7"
	aid:tcols="3">
	<Cell aid:table="cell" aid:crows="1" aid:ccols="2">
		<CellHeading>Situação do Beneficiário</CellHeading>
	</Cell>
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="98.93438079914081">
		<CellHeading>Taxas de Bonificação</CellHeading>
	</Cell>
	
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="78.09186111410146">
		<CellBodyCenter>
			<CharBold>Idade</CharBold>
		</CellBodyCenter>
	</Cell>
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="78.09186111410146">
		<CellBodyCenter>
			<CharBold>Carreira Contributiva (em anos)</CharBold>
		</CellBodyCenter>
	</Cell>
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="98.93438079914081">
		<CellBodyCenter>
			<CharBold>Mensal</CharBold>
		</CellBodyCenter>
	</Cell>
	
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="78.09186111410146">
		<CellBodyCenter>&lt; 65</CellBodyCenter>
	</Cell>
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="78.09186111410146">
		<CellBodyCenter>Condições de Acesso à Pensão sem Penalização</CellBodyCenter>
	</Cell>
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="98.93438079914081">
		<CellBodyCenter>0,65%</CellBodyCenter>
	</Cell>
	
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="78.09186111410146">
		<CellBodyCenter>&gt; 65</CellBodyCenter>
	</Cell>
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="78.09186111410146">
		<CellBodyCenter>15 a 24</CellBodyCenter>
	</Cell>
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="98.93438079914081">
		<CellBodyCenter>0.33%</CellBodyCenter>
	</Cell>
	
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="78.09186111410146"/>
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="78.09186111410146">
		<CellBodyCenter>25 a 34</CellBodyCenter>
	</Cell>
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="98.93438079914081">
		<CellBodyCenter>0.5%</CellBodyCenter>
	</Cell>
	
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="78.09186111410146"/>
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="78.09186111410146">
		<CellBodyCenter>35 a 39</CellBodyCenter>
	</Cell>
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="98.93438079914081">
		<CellBodyCenter>0.65%</CellBodyCenter>
	</Cell>
	
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="78.09186111410146">
		<CellBodyCenter>&gt; 65</CellBodyCenter>
	</Cell>
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="78.09186111410146">
		<CellBodyCenter>&gt; 40</CellBodyCenter>
	</Cell>
	<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="98.93438079914081">
		<CellBodyCenter>1.0%</CellBodyCenter>
	</Cell>
	
 
1

Minőségi követelmények...

minczerl · 2007. Jún. 12. (K), 22.21
Nem ütöttem meg a Weblabor minőségi követelményeit a téma nyitássommal vagy tényleg senkinek semmi ötlete nincs a problémámra?
2

Nem értem

inf · 2007. Jún. 13. (Sze), 02.51
Én speciel nem értem a kérdést :D Fogalmazd újra kérlek, mert ez így nekem zavaros. Ha jól értem, akkor egy ciklussal végigmész egy táblán, és annak a celláit írod át XMLbe, és nem tudsz mit kezdeni a colspannal és a rowspannal?
3

colspan

krey · 2007. Jún. 13. (Sze), 04.13
Szóval... Ha a rowspan nincs akkor a megoldás:
Először megszerzed az aid:tcols értékét és eltárolod egy változóba
Utána végigsöpörsz a cellákon. Eltárolod, hogy hány cella van eddig ebben a sorban. Megnézed, hogyha a következő adagot hozzáadod, akkor mi lesz. Ha kisebb, akkor ugyanez megint, ha egyenlő, akkor új sor, ha nagyobb, akkor error.

üdv. krey

ps. azért amikor parzolod remélem nem hagyod le a </Table>-t :)
pps. és megmondhatnád, h mivel szeretnéd parzolni, mer én még group függvényről nem hallottam... (monjuk for függvényről sem)
4

mégis én hibáztam...

minczerl · 2007. Jún. 13. (Sze), 09.39
Tényleg én voltam a "hunyó", elnézést kihagytam hogy XSLT-vel kellene mindezt megvalósítanom. Na szóval egy olyan transzformációt kell csinálnom erre az XML-re amivel kapok egy HTML táblázatot ügyelve a rowspanra és a colspanra. A xsl:for-each-group függvényre gondoltam mert azzal szépen meglehet csinálni az ilyen csoportosításokat, csak ez egy "speckó" eset és nem tudom hogy miként tudnám az attribútumok összegével megcsinálni ezt a csoportosítást. A google-val sem jutottam előbbre sajnos ezért gondoltam hátha van itt egy XSLT guru aki tudna segíteni előlrébb jutni a problémámba.

Köszönöm, és mégegyszer elnézést a pontatlan kérdésért.
5

Hátha jól jön még valakinek...

minczerl · 2007. Júl. 12. (Cs), 11.16

<xsl:stylesheet version="1.0"
		xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/">
		<xsl:output method="html"/>
		<xsl:key name="row" match="Cell"
			use=
			"
			concat
			(
			generate-id(..),'|',
			floor
			(
			sum(preceding-sibling::Cell/@aid:ccols) div
			../@aid:tcols
			)
			)
			"/>
		<xsl:template match="/">
			<xsl:element name="html">
				<xsl:element name="head">
					<xsl:element name="title"/>
				</xsl:element>
				<xsl:element name="body">
					<xsl:apply-templates/>
				</xsl:element>
			</xsl:element>
		</xsl:template>
		<xsl:template match="Table">
			<xsl:element name="table">
				<xsl:attribute name="border">1</xsl:attribute>
				<xsl:call-template name="rows">
					<xsl:with-param name="start" select="0"/>
					<xsl:with-param name="end" select="@aid:trows"/>
				</xsl:call-template>
			</xsl:element>
		</xsl:template>
		<xsl:template name="rows">
			<xsl:param name="start"/>
			<xsl:param name="end"/>
			<xsl:choose>
				<xsl:when test="$start = $end">
					<xsl:element name="tr">
						<xsl:apply-templates
							select=
							"
							key('row',concat(generate-id(),'|',$start))
							"/>
					</xsl:element>
				</xsl:when>
				<xsl:otherwise>
					<xsl:variable name="mid"
						select="$start + floor(($end - $start) div 2)"/>
					<xsl:call-template name="rows">
						<xsl:with-param name="start" select="$start"/>
						<xsl:with-param name="end" select="$mid"/>
					</xsl:call-template>
					<xsl:call-template name="rows">
						<xsl:with-param name="start" select="$mid + 1"/>
						<xsl:with-param name="end" select="$end"/>
					</xsl:call-template>
				</xsl:otherwise>
			</xsl:choose>
		</xsl:template>
		<xsl:template match="Cell[CellHeading]">
			<xsl:element name="th">
				<xsl:apply-templates select="@aid:ccols"/>
				<xsl:apply-templates select="CellHeading/text()"/>
			</xsl:element>
		</xsl:template>
		<xsl:template match="Cell">
			<xsl:element name="td">
				<xsl:apply-templates select="@aid:ccols"/>
				<xsl:apply-templates
					select=".//text()[normalize-space() != '']"/>
				<xsl:if test="normalize-space(.) = ''">&#160;</xsl:if>
			</xsl:element>
		</xsl:template>
		<xsl:template match="##kukac##aid:ccols[. = 1]"/>
		<xsl:template match="@aid:ccols">
			<xsl:attribute name="colspan">
				<xsl:value-of select="."/>
			</xsl:attribute>
		</xsl:template>
	</xsl:stylesheet>
Adobe meg kicsit összekaphatná magát hogy valamivel korrektebb XML-t generáljon :(.