10

Web コンテンツを作成するために、XML -> XSLT -> HTML ミームを調べています。XSLT の経験はほとんどありません。

抽象化または「リファクタリング」を処理するために、XSLT で利用できるメカニズムにはどのようなものがあるのか​​、興味があります。

たとえば、一般的な HTML とサービス サイド インクルードを使用すると、多くのページをテンプレート化して、たとえば共通のヘッダー、ナビゲーション、フッター セグメントがある場所に分解できます。ページ自体は基本的に本文です。

一般的なマークアップ言語である JSP、PHP、ASP では、これらすべてのセグメントに動的コンテンツ (すべてのヘッダー ブロックにユーザー名を追加するなど) を含めることができます。

JSP は、コンテンツの生成時に使用される引数を受け入れることができるタグ ファイルを作成できるようにすることで、さらに進化し、タグ自体内のコンテンツを囲んで処理することもできます。

同様の機能が XSLT 内で行われていることに興味があります。HTML ページの作成などのために XSLT の再利用可能なブロックを作成するための機能はありますか?

4

6 に答える 6

14

私自身のプロジェクトでは、これが私のページの分割方法です。各 XSL によってインポートされた template.xsl ファイルがありました。ほとんどのページには template.xsl しかありませんでしたが、カートなどの一部のページでは、解析するデータの種類が異なるため、独自のページが必要でした。

<page title="Home">
    <navigation>
        <!-- something here -->
    </navigation>
    <main>
        <!-- something here -->
    </main>
</page>

これは、私の template.xsl からの抜粋です。ここにすべての一般的なものを入れてから、ページに独自の情報を追加する機会を与えましたcall-template.

<xsl:template match="/page" name="page">  
    <html>
    <head>  
        <title><xsl:value-of select="(@title)" /></title>           
        <xsl:call-template name="css" />
        <xsl:call-template name="script" />
    </head>
    <body>
        <xsl:call-template name="container" />
    </body>
    </html>
</xsl:template>

私のcssタグがどのように応答するかの例。css-extended.css を呼び出すには、すべてのページに適用される共通の css しかないことに注意してください。一部のページはさらに必要でした。これらは css-extended をオーバーライドできます。call-templateページがテンプレートを呼び出してもどこにも定義されていない場合は失敗するため、 が必要であることに注意してください。

   <xsl:template name="css">
        <link rel="stylesheet" type="text/css" href="{$cssPath}reset.css"  />
        <link rel="stylesheet" type="text/css" href="{$cssPath}style.css"  />
        <link rel="stylesheet" type="text/css" href="{$cssPath}layout.css" />
        <xsl:call-template name="css-extended" />
    </xsl:template>   

    <!-- This is meant to be blank. It gets overriden by implementing stylesheets -->
    <xsl:template name="css-extended" />

私のコンテナーも同様の方法で動作します。一般的なものを定義してから、各ページで実装を提供するだけです。デフォルトの実装は XSL にありました。(中content)

  <xsl:template name="container">
        <div id="container">
            <xsl:call-template name="header" />
            <xsl:call-template name="content" />
            <xsl:call-template name="footer" />
        </div>
    </xsl:template>  

    <xsl:template name="content">
        <div id="content">
            <div id="content-inner">
                <xsl:call-template name="sideBar" />
                <xsl:call-template name="main" />
            </div>
        </div>
    </xsl:template>   

    <xsl:template name="main">
        <div id="main">
            <xsl:apply-templates select="main" />
            <xsl:call-template name="main-extended" />
       </div>
    </xsl:template>

    <!-- This is meant to be blank. It gets overriden by implementing stylesheets -->
    <xsl:template name="main-extended" />

<xsl:template name="footer">
        <div id="footer">
        <div id="footer-inner">
        <!-- Footer content here -->
        </div>
        </div>
</xsl:template>  

それは私にとって非常に美しく機能しました。お答えできる質問がありましたら、お知らせください。

于 2008-10-03T15:53:06.437 に答える
5

テンプレート、インクルード。

Xsl は、他のプログラミング言語とは大きく異なります。Its rule based.

Xslt について何か読んでから、もう少し具体的に質問することをお勧めします。

于 2008-10-03T15:37:53.083 に答える
2

XSL はテンプレートに基づいています。

XML データは、3 つのレベルで「再利用」できます。最も基本的なレベルでは<xsl:for-each />、XML を使用できます。

注: XSL の for-each はデータをループしているのではなく、データを照合しているだけです。また、for-each の「内部」の場合、その XML の「コンテキスト」の内部 (プログラミングにおける「スコープ」の概念に似ています)

for-each の使用と再利用の例

<xsl:for-each select="/xml/data/here">
    ... do some stuff ...
</xsl:for-each>
<xsl:for-each select="/xml/data/here">
    ... do some DIFFERENT stuff ...
</xsl:for-each>

for-each ノードはテンプレート ノードに含まれています (第 2 レベルの再利用)。テンプレート ノードには、Match と Named の 2 種類があります。テンプレートノードに一致し、上記の for-each ノードのように動作しますが、XSL 処理の開始時にいずれかのノードが一致すると、テンプレート エンジンによって自動的に呼び出されます。マッチ テンプレート ノードを明示的に適用することもできます。一方、名前付きテンプレートノードは常に明示的に適用され、同様の機能と考えることができます。

常に呼び出されるMatch テンプレートの例(ルート ノードが常に存在するため)

<xsl:template match="/">
    ... do some stuff ...
</xsl:template>

別のマッチ テンプレートを明示的に呼び出すマッチ テンプレート

<xsl:template match="/">
    <xsl:apply-templates select="xml/data/too" />
</xsl:template>

<xsl:template match="xml/data/too">
     ... do something ...
</xsl:template>

注: 一致テンプレートが機能するには、一致する XML ノードが存在する必要があります。一致しない場合、そのテンプレートは呼び出されません

名前付きテンプレートの例

<xsl:template name="WriteOut">
    ... data with NO Context Here ...
</xsl:template>

または、一致したテンプレートから名前付きテンプレートを呼び出す

<xsl:template match="/">
   <xsl:call-template name="WriteOut" />
<xsl:template>

注: 一致したテンプレートと名前付きのテンプレートを呼び出す場所を組み合わせて一致させることができます。自分がどのコンテキストにいるかを監視するだけで済みます。

すべてのテンプレート ノードはXSL Stylesheetsに保持され、さまざまなスタイルシートを含めインポートできます。たとえば、HTML ヘッダー ノードを扱うすべてのテンプレートを 1 つのテンプレートに保持し、HTML 本文ノードを扱うすべてのテンプレートを別のテンプレートに保持できます。次に、Header と Body の両方のスタイルシートを含む 1 つのスタイルシートを作成できます。

インクルード ノードの例

<xsl:include href="header.xsl" />

結論として、データのチャンクを抽象化するには、for-eaching、テンプレート化、またはスタイルシートを含めるという 3 つの方法があります。

于 2008-10-05T12:50:43.497 に答える
2

ページの一部を抽象化するために使用できる xsl の Include ステートメントと Import ステートメントの両方があります。XSLT 自体は、タグ ファイル タイプの動作を再現できるものです。必要なタグを使用して xml データ ファイルを編集します。その間、あなたの xsl テンプレートはそれらのタグをどうするかを知り、それらに遭遇します。

于 2008-10-03T15:44:30.917 に答える
2

テンプレートに名前を付けて、「call-template」で呼び出すことができます

XSLT 2.0 では、独自の関数を作成できます (ただし、構文が複雑だと思います)。

XSLT を使用して XSLT スタイルシートを生成することは、すばらしい研究分野です。これにより、スタイルシートの 90% がボイラープレートである一般的な変換シナリオを自動化できます。これを行うには、'namespace-alias' に慣れる必要があります。言語の知識を広げるのに最適な方法です。

于 2008-10-03T15:51:25.660 に答える
1

XSLT は強力ですが、ほとんどのプログラミング言語とは大きく異なり、利用できるものが非常に限られているため、別の言語に組み込まれているものを操作するには、非常に複雑な xsl 操作が必要になる場合があります。数週間前に多くの XSLT 作業を行っていたときに、ここのチートシートが役立つことがわかりました。

XSLT が特定の方法で物事を行うとは思わないでください。おそらくそれらのことを行う良い方法を見つけることができるでしょう。

于 2008-10-03T16:21:12.870 に答える