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 70 032c62852ef1
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
--- a/vstup/kontakt.xml	Sat Jan 07 19:06:18 2012 +0100
+++ b/vstup/kontakt.xml	Sat Jan 07 19:39:28 2012 +0100
@@ -50,6 +50,14 @@
 		<p>
 			Ale protože je to tajné, tak vám neřekneme, co A, B a C znamenají.
 		</p>
+		
+		<h2>Telefonní seznam</h2>
+		
+		<p>
+			Můžete nám kdykoli zavolat:
+		</p>
+		
+		<m:tabulka src="telefonní-seznam.csv"/>
 
 	</text>
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vstup/telefonní-seznam.csv	Sat Jan 07 19:39:28 2012 +0100
@@ -0,0 +1,6 @@
+Osoba;Místnost;Telefon
+pan továrník (majitel);1;+420 604 123456
+pan ředitel;2;+420 604 123654
+slečna sekretářka;2;+420 604 123465
+Linuxový guru;3;+420 604 123546
+Softwarový architekt;4;+420 604 123645
--- a/šablona/makra/tabulka.xsl	Sat Jan 07 19:06:18 2012 +0100
+++ b/šablona/makra/tabulka.xsl	Sat Jan 07 19:39:28 2012 +0100
@@ -17,11 +17,11 @@
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 -->
 <xsl:stylesheet version="2.0"
-	xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:m="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/makro"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	exclude-result-prefixes="m">
-	    
+xmlns="http://www.w3.org/1999/xhtml"
+xmlns:m="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/makro"
+xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+exclude-result-prefixes="m">
+
 	<!--
 		Jednoduché tabulky
 		******************
@@ -29,26 +29,44 @@
 		Sloupce oddělujeme tabulátorem (může jich být víc, minimálně však jeden, mezery nestačí).
 		První řádek se považuje za záhlaví (nadpisy sloupců).
 		*
+		@src volitelně můžeme data tabulky načítat ze souboru 
+		@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) 
 	-->
-    <xsl:template match="m:tabulka">
-    	<table>
-    		<xsl:variable name="data" select="replace(replace(text(), '^\s+', ''),'\s+$','')"/>
-    		<xsl:variable name="hlavička" select="substring-before($data, '&#10;')"/>
-    		<xsl:variable name="tělo" select="substring-after($data, '&#10;')"/>
-    		<thead>
-    			<tr>
-    				<xsl:for-each select="tokenize($hlavička, '\t+')">
-    					<xsl:if test="normalize-space(.)">
+	<xsl:template match="m:tabulka">
+		<xsl:call-template name="vykresliTabulku">
+			<xsl:with-param name="zadání" select="text()"/>
+			<xsl:with-param name="oddělovač" select="(@oddělovač, '\t+')[1]"/>
+		</xsl:call-template>
+	</xsl:template>
+	
+	<xsl:template match="m:tabulka[@src]">
+		<xsl:call-template name="vykresliTabulku">
+			<xsl:with-param name="zadání" select="unparsed-text(concat('../', $vstup, @src))"/>
+			<xsl:with-param name="oddělovač" select="(@oddělovač, ';')[1]"/>
+		</xsl:call-template>
+	</xsl:template>
+	
+	<xsl:template name="vykresliTabulku">
+		<xsl:param name="zadání"/>
+		<xsl:param name="oddělovač"/>
+		<table>
+			<xsl:variable name="data" select="replace(replace($zadání, '^\s+', ''),'\s+$','')"/>
+			<xsl:variable name="hlavička" select="substring-before($data, '&#10;')"/>
+			<xsl:variable name="tělo" select="substring-after($data, '&#10;')"/>
+			<thead>
+				<tr>
+					<xsl:for-each select="tokenize($hlavička, $oddělovač)">
+						<xsl:if test="normalize-space(.)">
 							<td><xsl:value-of select="normalize-space(.)"/></td>
 						</xsl:if>
 					</xsl:for-each>
-    			</tr>
-    		</thead>
-    		<tbody>
+				</tr>
+			</thead>
+			<tbody>
 				<xsl:for-each select="tokenize($tělo, '\n')">
 					<xsl:if test="normalize-space(.)">
 						<tr>
-							<xsl:for-each select="tokenize(., '\t+')">
+							<xsl:for-each select="tokenize(., $oddělovač)">
 								<xsl:if test="normalize-space(.)">
 									<td><xsl:value-of select="normalize-space(.)"/></td>
 								</xsl:if>
@@ -56,9 +74,9 @@
 						</tr>
 					</xsl:if>
 				</xsl:for-each>
-    		</tbody>
-    	</table>    
-    </xsl:template>
+			</tbody>
+		</table>
+	</xsl:template>
 
 </xsl:stylesheet>