Шаблон проектирования таблиц стилей XSLT - отдельные общие и специальные шаблоны в разных таблицах стилей - PullRequest
4 голосов
/ 17 февраля 2010

Мне было интересно, существует ли хороший подход в шаблоне проектирования таблиц стилей 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>

Мне было интересно, может ли такая идея быть реализована вообще и как это сделать правильно, очевидно, моя не работает.

Кроме того, какой подход будет лучше в этом случае: включить или импортировать таблицу стилей? Я думаю, что с одним из них мне не нужно снова перечислять все переменные.

Буду признателен за любую помощь! Извините за длинный пост, и если это не так ясно.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 17 февраля 2010

Я использую следующий метод:

Файл шаблона (/templates/Main.xslt)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="utf-8" />
  <xsl:include href="../functions/General.xslt"/>
  <xsl:template match="/">
    <html xml:lang="en">
      <head>
      </head>
      <body>
         Template Content
         <xsl:call-template name="PageContent" />
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Файл функций (/functions/General.xslt)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- Generic functions used in the site go in here -->
</xsl:stylesheet>

Файл страницы (/default.xslt)

Там будет несколько из них, чтобы определить различные макеты в шаблоне. Это XSLT-файл, который вы вызываете при преобразовании.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:import href="templates/Main.xslt" />
    <xsl:output method="xml" encoding="utf-8" />
    <xsl:template match="/">
        <xsl:apply-imports />
    </xsl:template>
    <!-- CONTENT -->
    <xsl:template name="PageContent">
      <!-- Put your specific page stuff here -->
    </xsl:template>
</xsl:stylesheet>
2 голосов
/ 18 февраля 2010

Рекомендуется накапливать часто используемые шаблоны в файлах таблиц стилей , которые будут импортированы конкретными приложениями XSLT. Коллекции таких полезных файлов xstylesheet делают полезными библиотеки .

Конечно, импортируемый модуль таблицы стилей часто импортирует другие модули таблицы стилей.

Примером является библиотека FXSL для функционального программирования в XSLT. Посмотрите, как приложения XSLT (примеры файлов testxxx.xsl) импортируют необходимые им функции.

...