2009-03-14 2 views
4

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

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: импортировать все.
  • i dont want 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> 

мы не нужны общий корень <Page> элемент.

ответ

1

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

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

0

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

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

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

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

+0

Aa leading/на самом деле не очень хорошее решение. Значение атрибута @match является «шаблоном соответствия» и, как таковое, не обязательно должно быть абсолютным выражением XPath. К каким узлам применяется шаблон, определяется динамическим контекстом , который его выбирает. –

+0

@Dimitre: это хорошая идея, если вы хотите, чтобы она соответствовала элементам главной страницы. –

0

Я действительно рад, что нашел этот пример, поскольку я искал проверку, что на самом деле это правильный подход к настройке шаблона мастера/подчиненного. Однако приведенные примеры не работают из коробки на tomcat - так что просто помогать другим, кто знает, как копировать пасту, это рабочий набор tomcat файлов master/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: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"/> 
<!-- http://stackoverflow.com/questions/646878/master-stylesheet-sharing-in-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> 

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

Смежные вопросы