2009-06-24 9 views
10

私はHTMLを出力するXSL変換があります。 head要素には、CSSファイル参照があります。XSLTで外部CSSとJavaScriptをコピーするには

<link rel="stylesheet" type="text/css" href="css/styles.css"/> 

外部参照なしでスタンドアロンのHTML結果を作成したいので、外部CSS参照を含めたいと思います。コードの重複を防ぐため、XSLTテンプレートにスタイルをハードコードしたくないので、CSSファイルのファイル内容をコピーするXSLTコマンドを探しています。私はxsl:includeまたはxsl:importがXSLTファイルを期待しているので動作しないことを知っています。どちらもありませんXMLに準拠すると予想されるので、

<xsl:copy-of select="document('css/styles.css')"/> 

と同様です。

私もコピーしたいJavaScript関数の宣言があります。

これは純粋なXSLTで可能ですか、またはXSLTファイルの前処理(またはHTMLファイルの後処理)を行う必要がありますか?

答えて

10

XSLT 2.0は、XMLではないURL経由でドキュメントを読み取るためのunparsed-text()関数を提供します。

XSLT 1.0では、CSSについてスクリプトすぎる必要がない場合は、次のコマンドを使用してCSSファイルをXMLと互換性を持たせることができます。そして、幸いにも、ブラウザはHTMLコメントを許容します。

<style type="text/css"> 
    <xsl:value-of select="document('test.css')" disable-output-escaping="yes" /> 
</style> 
+3

これは私のために働く。 < >と文字に問題があります。私は <![CDATA []> javascriptでも動作します。 – GrGr

+0

今あなたのxsltファイルを表示できますか? –

0

おそらく、スタイルシートがXMLだと思ってしまうかもしれません。

Styles.cssを

/* 
<?xml version="1.0" encoding="utf-8"?> 
<style> 
<![CDATA[ 
*/ 
... styles ... 
/* 
]]> 
</style> 
*/ 

それはハックですが、それは十分かもしれない他の方法が存在しない場合(それがすべてで動作すると仮定した場合)。

+1

いずれにしても、CCSテキストは有効なXMLテキストではないので動作しません。たとえば、 "div> p"セレクタ、またはフォント宣言のすべてのエスケープされていない二重引用符を考えてみてください。 – Tomalak

+0

次に、CDATAセクションを追加します。回答が更新され、使用状況が表示されます。 – SpliFF

+0

いいえ、CDATAでも。 xsltprocはコメント記号が気に入らない。それは言う: css/styles.css:1:パーサーエラー:開始タグは、 '<'は見つかりませんでした /* ^ – GrGr

0

CSS

<!--/*--><root><![CDATA[<!--*/--> 
body 
{ 
    margin: 0; 
} 
div > p 
{ 
    background-color: yellow; 
} 
<!--/*-->]]></root><!--*/--> 

XSLTは、CSSのコンテンツをラップする処理命令を使用します。

<?xml version="1.0" encoding="utf-8"?> 
    <root> 
    <?wrapper html 
     <html> 
     <link rel="stylesheet" type="text/css" href="css/styles.css"/> 
     </html> 
    ?> 
    </root> 

そして、それをレンダリングするために、既存のxsl:copy-of select文を微調整:

<xsl:copy-of select="document('css/styles.css')//processing-instruction()"/> 
関連する問題