2009-08-25 17 views
0

XMLのデータをWMLに変換する必要があります。私は、ファイル構造を変更することはできませんPHPの条件付きXSLT変換

<root> 
    <category name="music"/> 
    <subcategory name="classic"/> 
    <subcategory name="rock"/> 
    <subcategory name="Techno"/> 
    <node type="music" subtype="classic" name="beethoven"/> 
    <node type="music" subtype="classic" name="chopin"/> 
    <record author="beethoven" name="moonlight sonata"/> 
    … 
</root> 

それはこのようなものです。

一部のNokiaモバイルブラウザでは、<card>のロットをメモリにロードできません。

ので、携帯電話のブラウザによっては、WMLページは<card>のセット全体年代、または<card>のサブセット年代のどちらかでなければなりません。例えば

私は通常のブラウザでページをダウンロードした場合、それは次のようになります。

<wml> 
<card id="TOC"> 
    <p><a href="#contents">Contents</a></p> 
    <p><a href="#az">A-Z</a></p> 
</card> 
<card id="contents"> 
    <p><a href="#music">music</a></p> 
    <p><a href="#video">video</a></p> 
    <p><a href="#java">java</a></p> 
</card> 
<card id="az"> 
    <p><a href="#beethoven">beethoven</a></p> 
    <p><a href="#chopin">chopin</a></p> 
</card> 
<card id="music"> 
    <p><a href="#classic">classic</a></p> 
    <p><a href="#rock">rock</a></p> 
    <p><a href="#Techno">Techno</a></p> 
</card> 
<card id="classic"> 
    <p><a href="#beethoven">beethoven</a></p> 
    <p><a href="#chopin">chopin</a></p> 
</card> 
… 
</wml> 

、ユーザーがサーバーへのラウンドトリップなしで閲覧できるようにします。

http://example.com/classic 

<wml> 
<card id="TOC"> 
    <p><a href="#contents">Contents</a></p> 
    <p><a href="#az">A-Z</a></p> 
</card> 
<card id="contents"> 
    <p><a href="/music">music</a></p> 
    <p><a href="/video">video</a></p> 
    <p><a href="/java">java</a></p> 
</card> 
<card id="az"> 
    <p><a href="#beethoven">beethoven</a></p> 
    <p><a href="#chopin">chopin</a></p> 
</card> 
<card id="classic"> 
    <p><a href="#beethoven">beethoven</a></p> 
    <p><a href="#chopin">chopin</a></p> 
</card> 
… 
</wml> 
:私は hrefを訪問するとき、それは内部の内容を表示する必要があり、

http://example.com/ 

<wml> 
<card id="TOC"> 
    <p><a href="#contents">Contents</a></p> 
    <p><a href="#az">A-Z</a></p> 
</card> 
<card id="contents"> 
    <p><a href="#music">music</a></p> 
    <p><a href="#video">video</a></p> 
    <p><a href="#java">java</a></p> 
</card> 
<card id="az"> 
    <p><a href="/beethoven">beethoven</a></p> 
    <p><a href="/chopin">chopin</a></p> 
</card> 
<card id="music"> 
    <p><a href="/classic">classic</a></p> 
    <p><a href="/rock">rock</a></p> 
    <p><a href="/Techno">Techno</a></p> 
</card> 
<card id="video"> 
    <p><a href="/movies">Movies</a></p> 
</card> 
<card id="java"> 
    <p><a href="/games">Games</a></p> 
</card> 
</wml> 

:私はNokiaを使用して、スタートページを訪問したときに

しかし、ページは次のようになります。

XSLTは、基本的に以下のことを行う必要があります。

  • 何が表示されるべきかのパラメータを受け入れる:カテゴリ、サブカテゴリなど

  • 表示される<card>を数えます。

    1. 我々は唯一のタイプをロードし、TOC場合は、我々は唯一のタイプおよびサブタイプをロードする場合、我々は10カードを取得2カード(私たちは常にそれらを表示)
      • を取得します。
      • タイプ、サブタイプ、タイトルを読み込むと、100カードが表示されます。
      • すべてをロードすると、300カードが表示されます。

    Nokia以上120のカードを扱うことができないので、我々はちょうどレベル3で停止します。

    XML変更やレベル3130カードが必要な場合、我々はレベル2に停止する必要があります。それは、カードが表示されない場合/(外側リンク)と#(内部リンク)を交換一定レベル以下

  • ある場合

  • <card>を表示しません。

XSLファイルで行うことはできますか?

+0

URLのレベルは1つしかありませんか?スラッシュ+キーワード、それ?それはあいまいさにつながりませんか?またはURLは構造化されていますか? – Tomalak

+0

いいえ、そうではありません。それは一度にすべてのカードを保持するように設計されており、別個の名前を持つ必要があります。この問題は、テストするときに発生したばかりです。 – Quassnoi

+0

@名前はすべてのカテゴリ/サブカテゴリ/ノード/レコード要素で一意であると信じられますか? – Tomalak

答えて

1

質問が本当に何であるか分かりません。言い換えれば、答えは「はい、可能です」 - xsl:ifxsl:chooseは、すべての条件を処理するのに十分なはずです。パラメータを介してスタイルシートに制限(例えば、結果がNokiaに送られるという事実など)を伝える必要があります - xsl:paramを参照してください。

0

各レベルのすべてのノード(タイプ、サブタイプ、タイトルなど)を累積的に数える変数を作成し、生成するカードの最大数を示すパラメータをXSLに提供することをお勧めします。 XSLは次のようになります。

<xsl:stylesheet …> 
    <xsl:param name="max-cards" select="999999"/> 

    <xsl:template match="/root"> 
    <!-- "2" here for the type/TOC cards --> 
    <xsl:variable name="nSubs" select="2 + count(subcategory)"/> 
    <xsl:variable name="nNodes" select="$nSubs + count(node)"/> 
    <xsl:variable name="nRecs" select="$nNodes + count(record)"/> 

    <!-- generate types & TOC here --> 

    <xsl:if test="$nSubs < $max-cards"> 
     <!-- generate subtypes here --> 
    </xsl:if> 

    <xsl:if test="$nNodes < $max-cards"> 
     <!-- generate titles here --> 
    </xsl:if> 

    <xsl:if test="$nRecs < $max-cards"> 
     <!-- generate everything else here --> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

スタイルシートのパラメータは、同様に上位レベルの生成を制限するために使用することができますが、そのための例は、SOのために過度に長くなります。 ^。^

0

私の理解では、XSLは完全にチューリングされているので、ほとんどすべての回答が可能ですか?質問はイエスになるだろう。

簡単な方法でモジュール化しておくと、< xsl:param >に制御パラメータを渡すことができます。また、 < xsl:表示する形式を選択するには>を選択し、各形式の特定のテンプレートまたは関数に分岐/委任します。

フォーマットに共通するものがある場合は、それらの部分を独自のテンプレートまたは関数に委譲して、主なフォーマットの上位レベルのテンプレートでそれらを再利用してDRYすることができます。基本的に分裂して征服する。

編集:委譲することで、私が何を意味するかについて具体的には、私は明示的に例えば、テンプレートを呼び出し、それらをパラメータ化意味:他人に委任する順番に、それらのテンプレートで

<xsl:call-template name="showcard"> 
    <xsl:with-param name="kind" select="nokia"/> 
    </xsl:call-template> 

、などあなたがも得ることができます特定のテンプレートにフローを向けるバリュー・オブ・アンド・アプライ・テンプレートからたくさんのものがあります。あなたのケースはおそらく簡単ですが、これはより読みやすいコードにつながる可能性があります。

+0

実際には、私は再利用可能なテンプレートを用意しています。そのため、カードレイアウトを変更したい場合は、(Nokiaと通常の両方のブラウザ用に)1か所で行います。私はparamsとchoosesについて知っている、私はちょうどそれらを正しく使用することはできません、私が得るすべてがひどい混乱のように見える。 – Quassnoi

+0

はい、これはまだ1つのxslファイルで、xml入力を下降させるためのxsl:templateコンポーネントがたくさんあります。私はxsl:templateをサブルーチンや手続き/関数として考える。 – frankodwyer