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が必要になりますので、私は、マスタースタイルシートから起動することはできません。すべてをインポートします。
  • 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と呼ばれ、FXSL library(XSLTで完全に書かれています)でXSLTに実装されています。

0

これは私には正しいと思われます...私は過去に使用したものに非常によく似ています(ただし、私はしばしば<xsl:include/>を使用しましたが、どちらかがうまくいくはずです)。私が作るかもしれない主な変更点は、(少なくとも、マスターXSLTで)試合がより明確にすることです - つまり

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

ので、それが誤って他の場所(例えば、データのページング、でPage要素とは一致しません<Page Index="3" Size="20"/>のように)。

私が行う他の一般的なことは、xsl:messageを使用する「*」一致を追加して、ノードに対してより具体的な一致がない場合にエラーをスローすることです。これは、タイプミスなどがあるときにはっきりします。

+0

Aaが主導的/実際には良い決断ではありません。 @match属性の値が「一致パターン」であり、そのようにitdoesn't絶対XPath式である必要があります。テンプレートが適用されているノードにのの(動的な)文脈によって決定されることを選択します。 –

+0

@Dimitre:あなただけそれがルートページ要素を一致させたい場合は、それは良いアイデアです。 –

0

これは、実際にマスター/スレーブテンプレート設定に正しいアプローチであることを確認するために探していたので、実際にこの例を見つけてうれしく思います。 しかし、提供されている例はtomcatの箱の中ではうまくいきませんでした。そこで、ここにペーストをコピーする方法しか知りませんでした。

マスター。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> 

希望、これは他の人を助けることができる - 私のノートをドロップする恥ずかしがらないでください。

関連する問題