2

xslt の新機能。umbraco で使用するため、バージョン 1.0 です。

インライン フッター リストのリンク間にセパレータを挿入しようとしているため、最初のリンクを除く各リンクの前に配置されます。これは単純なプログラミングの問題です。ループの外側でフラグを 0 に設定し、ループに入ったら、フラグが 1 かどうかをテストし、そうでない場合はリンクの前にセパレーターを追加することをスキップします。最初のループの最後のビットとして、フラグを 1 に設定します。

xsltでこれを達成するにはどうすればよいですか? 構文と、変数値が設定されると変更できないことを読んで、少し困惑しています。誰もが簡単な例を持っていますか?

4

2 に答える 2

4

簡単な例を次に示します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pBase" select="'http://myBase.com/'"/>

 <xsl:template match="num">
  <xsl:if test="position() > 1">, </xsl:if>
  <a href="{$pBase}{.}"><xsl:value-of select="."/></a>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用される場合:

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

必要な正しい結果が生成されます。

<a href="http://myBase.com/01">01</a>, <a href="http://myBase.com/02">02</a>, <a href="http://myBase.com/03">03</a>, <a href="http://myBase.com/04">04</a>, <a href="http://myBase.com/05">05</a>, <a href="http://myBase.com/06">06</a>, <a href="http://myBase.com/07">07</a>, <a href="http://myBase.com/08">08</a>, <a href="http://myBase.com/09">09</a>, <a href="http://myBase.com/10">10</a>

ブラウザに次のように表示されます

01、02、03、04、05、06、07、08、09、10 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

説明:

  1. XSLT は関数型言語です。これは、変数を一度定義すると変更できないことを意味します。

  2. 標準の XPathposition()関数を使用して、現在のノードの位置に特定の値があるかどうかを確認できます。

  3. 組み込みの XSLT テンプレートが使用され、要素に一致するテンプレートの本体は<xsl:apply-templates/>. これは次の省略形です:<xsl:apply-templates select="child::node()"/>現在のノードのすべてのノードの子にテンプレートを適用します -- ドキュメントの順序で。

  4. を指定<xsl:strip-space elements="*"/>したため、XML ドキュメントの解析中に、任意の要素の空白のみの子が削除されました。これにより、最上位要素の非空白の子ノードのみが残りnums、それらはすべてnum要素です。

  5. テンプレート内の関数の値は、命令が実行さposition()れたときに形成されるノード リスト内の現在のノードの位置です。<xsl:apply-templates>これはposition()、テンプレート マッチング内の関数の値が、 num1 番目のnum要素が処理されると 1、2 番目の要素が処理されると 2 num、...、10 番目のnum要素が処理されると 10 であることを意味します。

  6. の値が 1 より大きいすべてのnum要素に対して生成された出力は、文字列 ", " で始まります。この質問の要件とまったく同じです。position()この場合の値は 1 であるため、最初のnum要素の文字列 ", " は生成されませんposition()

于 2012-11-20T03:37:10.807 に答える
3

XSLT には時間のようなものはありません。時間の概念がないため、「ループの最初の時間」を検出することはできません。したがって、最初の時間はありません。実際、これは従来のプログラミングの意味でのループではありません。入力リスト内のすべての項目は、概念的に並行して処理されます。そのため、後の反復で使用する変数を設定することはできません。「後の反復」などというものはありません。

できることは、入力シーケンスの最初の項目 (または xsl:sort を使用する場合は、並べ替え後の入力シーケンスの最初の項目) を処理していることを検出することです。test でそれを行いますposition() = 1

于 2012-11-20T09:50:50.503 に答える