Tabulky #15: data tabulky můžeme načítat i ze souboru + můžeme určit oddělovač.
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sat, 07 Jan 2012 19:39:28 +0100
changeset 70032c62852ef1
parent 69 e7908e307b61
child 71 895757141bff
Tabulky #15: data tabulky můžeme načítat i ze souboru + můžeme určit oddělovač.
vstup/kontakt.xml
vstup/telefonní-seznam.csv
šablona/makra/tabulka.xsl
     1.1 --- a/vstup/kontakt.xml	Sat Jan 07 19:06:18 2012 +0100
     1.2 +++ b/vstup/kontakt.xml	Sat Jan 07 19:39:28 2012 +0100
     1.3 @@ -50,6 +50,14 @@
     1.4  		<p>
     1.5  			Ale protože je to tajné, tak vám neřekneme, co A, B a C znamenají.
     1.6  		</p>
     1.7 +		
     1.8 +		<h2>Telefonní seznam</h2>
     1.9 +		
    1.10 +		<p>
    1.11 +			Můžete nám kdykoli zavolat:
    1.12 +		</p>
    1.13 +		
    1.14 +		<m:tabulka src="telefonní-seznam.csv"/>
    1.15  
    1.16  	</text>
    1.17  
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/vstup/telefonní-seznam.csv	Sat Jan 07 19:39:28 2012 +0100
     2.3 @@ -0,0 +1,6 @@
     2.4 +Osoba;Místnost;Telefon
     2.5 +pan továrník (majitel);1;+420 604 123456
     2.6 +pan ředitel;2;+420 604 123654
     2.7 +slečna sekretářka;2;+420 604 123465
     2.8 +Linuxový guru;3;+420 604 123546
     2.9 +Softwarový architekt;4;+420 604 123645
     3.1 --- a/šablona/makra/tabulka.xsl	Sat Jan 07 19:06:18 2012 +0100
     3.2 +++ b/šablona/makra/tabulka.xsl	Sat Jan 07 19:39:28 2012 +0100
     3.3 @@ -17,11 +17,11 @@
     3.4  along with this program.  If not, see <http://www.gnu.org/licenses/>.
     3.5  -->
     3.6  <xsl:stylesheet version="2.0"
     3.7 -	xmlns="http://www.w3.org/1999/xhtml"
     3.8 -	xmlns:m="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/makro"
     3.9 -	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    3.10 -	exclude-result-prefixes="m">
    3.11 -	    
    3.12 +xmlns="http://www.w3.org/1999/xhtml"
    3.13 +xmlns:m="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/makro"
    3.14 +xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    3.15 +exclude-result-prefixes="m">
    3.16 +
    3.17  	<!--
    3.18  		Jednoduché tabulky
    3.19  		******************
    3.20 @@ -29,26 +29,44 @@
    3.21  		Sloupce oddělujeme tabulátorem (může jich být víc, minimálně však jeden, mezery nestačí).
    3.22  		První řádek se považuje za záhlaví (nadpisy sloupců).
    3.23  		*
    3.24 +		@src volitelně můžeme data tabulky načítat ze souboru 
    3.25 +		@oddělovač regulární výraz, který odděluje sloupce – např. „\t+“ pro tabulátory (výchozí pro tabulky vložené přímo do stránky) nebo „;“ pro středník (výchozí pro tabulky načítané ze souboru) 
    3.26  	-->
    3.27 -    <xsl:template match="m:tabulka">
    3.28 -    	<table>
    3.29 -    		<xsl:variable name="data" select="replace(replace(text(), '^\s+', ''),'\s+$','')"/>
    3.30 -    		<xsl:variable name="hlavička" select="substring-before($data, '&#10;')"/>
    3.31 -    		<xsl:variable name="tělo" select="substring-after($data, '&#10;')"/>
    3.32 -    		<thead>
    3.33 -    			<tr>
    3.34 -    				<xsl:for-each select="tokenize($hlavička, '\t+')">
    3.35 -    					<xsl:if test="normalize-space(.)">
    3.36 +	<xsl:template match="m:tabulka">
    3.37 +		<xsl:call-template name="vykresliTabulku">
    3.38 +			<xsl:with-param name="zadání" select="text()"/>
    3.39 +			<xsl:with-param name="oddělovač" select="(@oddělovač, '\t+')[1]"/>
    3.40 +		</xsl:call-template>
    3.41 +	</xsl:template>
    3.42 +	
    3.43 +	<xsl:template match="m:tabulka[@src]">
    3.44 +		<xsl:call-template name="vykresliTabulku">
    3.45 +			<xsl:with-param name="zadání" select="unparsed-text(concat('../', $vstup, @src))"/>
    3.46 +			<xsl:with-param name="oddělovač" select="(@oddělovač, ';')[1]"/>
    3.47 +		</xsl:call-template>
    3.48 +	</xsl:template>
    3.49 +	
    3.50 +	<xsl:template name="vykresliTabulku">
    3.51 +		<xsl:param name="zadání"/>
    3.52 +		<xsl:param name="oddělovač"/>
    3.53 +		<table>
    3.54 +			<xsl:variable name="data" select="replace(replace($zadání, '^\s+', ''),'\s+$','')"/>
    3.55 +			<xsl:variable name="hlavička" select="substring-before($data, '&#10;')"/>
    3.56 +			<xsl:variable name="tělo" select="substring-after($data, '&#10;')"/>
    3.57 +			<thead>
    3.58 +				<tr>
    3.59 +					<xsl:for-each select="tokenize($hlavička, $oddělovač)">
    3.60 +						<xsl:if test="normalize-space(.)">
    3.61  							<td><xsl:value-of select="normalize-space(.)"/></td>
    3.62  						</xsl:if>
    3.63  					</xsl:for-each>
    3.64 -    			</tr>
    3.65 -    		</thead>
    3.66 -    		<tbody>
    3.67 +				</tr>
    3.68 +			</thead>
    3.69 +			<tbody>
    3.70  				<xsl:for-each select="tokenize($tělo, '\n')">
    3.71  					<xsl:if test="normalize-space(.)">
    3.72  						<tr>
    3.73 -							<xsl:for-each select="tokenize(., '\t+')">
    3.74 +							<xsl:for-each select="tokenize(., $oddělovač)">
    3.75  								<xsl:if test="normalize-space(.)">
    3.76  									<td><xsl:value-of select="normalize-space(.)"/></td>
    3.77  								</xsl:if>
    3.78 @@ -56,9 +74,9 @@
    3.79  						</tr>
    3.80  					</xsl:if>
    3.81  				</xsl:for-each>
    3.82 -    		</tbody>
    3.83 -    	</table>    
    3.84 -    </xsl:template>
    3.85 +			</tbody>
    3.86 +		</table>
    3.87 +	</xsl:template>
    3.88  
    3.89  </xsl:stylesheet>
    3.90