общий доступ к таблицам стилей в XSLT - PullRequest
4 голосов
/ 15 марта 2009

Я хотел бы создать мастер-шаблон в XSLT, который можно сохранить в отдельном файле. Все остальные таблицы стилей страницы делятся этим с помощью xsl: import.

master.xslt

 <xsl:template match="Page">
  <html>
   <head>
   </head>
   <body>

     <call-template name="Content"/>

   </body>
  </html> 
 </xsl:template>
<xsl:stylesheet>

page.xslt

<xsl:stylesheet>
<xsl:import href="master.xslt"/>

<xsl:template match="/">
  <apply-templates match="Page"/>
</xsl:template>

<xsl:template name="Content">
  ... apply something page-specific
</xsl:template>

</xsl:stylesheet>

page.xml

<Page>
 ... something page-specific
</Page>

Могу ли я улучшить это решение?

  • Я не могу начать с главной таблицы стилей, потому что мне понадобится xsl: import all.
  • Я не хочу, чтобы master.xslt содержал ссылки на каждой конкретной странице.

Другое решение (против духа xslt) может быть таким:

master.xslt

<xsl:template name="masterHead">
 <html>
  <head>
  </head>
  <body>
</xsl:template>

<xsl:template name=masterEnd>
 </body>
 </html> 
</xsl:template>

</xsl:stylesheet>

page.xslt

<xsl:stylesheet>
<xsl:import href="master.xslt"/>

<xsl:template match="/">
  <call-template name=masterHead>
   ... apply something page-specific
  <call-template name=masterEnd/>
</xsl:template>

</xsl:stylesheet>

нам не нужен общий элемент root <Page>.

Ответы [ 3 ]

1 голос
/ 15 марта 2009

Использование <xsl:import> - правильное проектное решение . Это как раз основной сценарий использования, для которого предназначена директива XSLT.

Можно пойти еще дальше - поиск директивы <xsl:apply-imports>, и в дополнение к тому, как импортированная таблица стилей может применять шаблоны, о которых действия и смысл это абсолютно ничего не знает. Последний называется Функции высшего порядка и реализован в XSLT с библиотекой FXSL (полностью записан в XSLT).

0 голосов
/ 23 сентября 2009

Я на самом деле рад, что нашел этот пример, так как я искал подтверждение того, что это действительно правильный подход к настройке шаблона master / slave. Однако приведенные примеры не работали «из коробки» на tomcat - поэтому просто для того, чтобы помочь другим, кто знает, как копировать вставку, есть рабочий набор файлов master / slave для tomcat.

Master.xsl:

<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" encoding="iso-8859-15" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" indent="no"/>
<!-- /615197/obschii-dostup-k-tablitsam-stilei-v-xslt -->
 <xsl:template match="ms247">
  <html>
   <head>
    <title>test</title>
   </head>

   <body>
    <div style="border: 1px solid black; width: 200px; float: left; margin: 10px; padding: 5px;">
     <xsl:call-template name="left"/>
    </div>
    <div style="border: 1px solid black; width: 200px; float: left; margin: 10px; padding: 5px;">
     <xsl:call-template name="content"/>
    </div>
    <div style="border: 1px solid black; width: 200px; float: left; margin: 10px; padding: 5px;">
     <xsl:call-template name="right"/>
    </div>
   </body>
  </html>
 </xsl:template>


 <xsl:template name="content">
  <span style="color: red">Content template is empty - overrule in page template.</span>
 </xsl:template>

 <xsl:template name="left">
  <span style="color: red">Left template is empty - overrule in page template.</span>
 </xsl:template>

 <xsl:template name="right">
  <span style="color: red">Right template is empty - overrule in page template.</span>
 </xsl:template>
</xsl:stylesheet>

И slave.xsl:

<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:import href="master.xsl"/>

 <xsl:template name="content">
  ... apply something page-specific
 </xsl:template>

 <xsl:template name="right">
  And we have RIGHT content!
  <!-- Execute matching template which is NOT triggered automatically -->
  <xsl:apply-templates select="params/param"/>
 </xsl:template>

 <!-- And we do not define any left template -->

 <!-- Example -->
 <xsl:template match="ms247/params/param">
  Paramters on page: <xsl:value-of select="@name"/><br/>
 </xsl:template>
</xsl:stylesheet>

Надеюсь, что это может помочь другим - не стесняйтесь, оставьте мне записку.

0 голосов
/ 15 марта 2009

Это выглядит как раз для меня ... очень распространено в том, что я использовал в прошлом (хотя я часто использовал <xsl:include/>, но любой из них должен работать). Основное изменение, которое я мог бы сделать, - сделать совпадение более явным (по крайней мере, в master xslt) - т.е.

<xsl:template match="/Page"> <!-- leading slash -->

, поэтому он не будет случайно совпадать с Page элементами в других местах (например, с подкачкой данных, например <Page Index="3" Size="20"/>).

Еще одна распространенная вещь, которую я делаю, - это добавление соответствия "*", которое использует xsl:message, чтобы выдать ошибку, если у меня нет более конкретного соответствия для узла. Это делает это более очевидным, когда у вас есть опечатка и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...