Мне было интересно, существует ли хороший подход в шаблоне проектирования таблиц стилей XSLT для разделения общего и конкретного представления данных.
Я пытался, но очень растерялся и потерян. Буду признателен за любые советы, советы, подсказки, где я могу прочитать о том, как лучше разделять таблицы стилей XSLT. А также, буду очень признателен за помощь с приведенным ниже примером, так как он не работает = / СПАСИБО!
Мне нужно создать множество документов HTML с разным внешним видом, которые бы повторно использовали некоторые данные. Например, дата документа, данные подписи (имя, должность) и так далее. Кроме того, я использую довольно много глобальных переменных (потому что XML плохо структурирован и данные повторно используются в документе).
То, что я пытался сделать, это переместить все шаблоны, которые создали бы общую структуру HTML, в одну таблицу стилей, и тогда все конкретные биты будут в их собственной таблице стилей.
Примерно так:
Таблица стилей общих храмов "commonTemplates.xsl"
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- Variables Local -->
...
<xsl:output method="html" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
doctype-system="http://www.w3.org/TR/html4/loose.dtd" indent="yes" />
<xsl:template match="/Bookings">
<html>
<head>
<!-- populated by a template in a specific stylesheet -->
<title><xsl:call-template name="docTitle"/></title>
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<!-- general template for date -->
<xsl:template match="/Bookings/Booking" name="docDate">
<p class="date"><xsl:value-of select="./@Date"/></p>
</xsl:template>
<!-- general template for signature -->
<xsl:template match="/Bookings/Booking/Users" name="signature">
<xsl:param name="signatureLine" select="'Yours sincerely,'"/>
<div id="signature">
<p><xsl:value-of select="$signatureLine"/></p>
<p class="details">
<!-- populated by a template in a specific stylesheet -->
<xsl:apply-templates select="." mode="signature"/>
</p>
</div>
</xsl:template>
<!-- dummy templates signatures otherwise it complains that there is no such template -->
<xsl:template name="docTitle"/>
</xsl:stylesheet>
Таблица стилей конкретных храмов:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- Imports -->
<xsl:import href="commonTemplates.xsl"/>
<!-- BODY CONTENT OF HTML PAGE -->
<xsl:template match="/Bookings/Booking">
<xsl:call-template name="docDate"/>
<!-- document's content -->
<div>
<xsl:call-template name="content" />
</div>
</xsl:template>
<xsl:template name="docTitle">
<xsl:text>Here is the document title</xsl:text>
</xsl:template>
<!-- some content at the end of which signature should be inserted -->
<xsl:template name="content">
<p>SOME CONTENT</p>
<xsl:apply-templates />
</xsl:template>
<!-- specific rule to insert appropriate data for signature -->
<xsl:template match="/Bookings/Booking/Users" mode="signature">
<span class="name"><xsl:value-of select="./@Name"/></span>
<span class="job"><xsl:value-of select="./@Title"/></span>
</xsl:template>
</xsl:stylesheet>
К сожалению, шаблон для подписи не работает, и я не могу понять, почему :( Хотя он и подходит для docTitle.
Результат HTML выглядит следующим образом:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<p class="date">16 February 2010</p>
<div id="secondDeposit">
<p>SOME CONTENT</p>
<!-- here I get lots of empty space -->
</div>
</body>
Мне было интересно, может ли такая идея быть реализована вообще и как это сделать правильно, очевидно, моя не работает.
Кроме того, какой подход будет лучше в этом случае: включить или импортировать таблицу стилей? Я думаю, что с одним из них мне не нужно снова перечислять все переменные.
Буду признателен за любую помощь! Извините за длинный пост, и если это не так ясно.
Спасибо!