0

そこで、スタッフのプロフィールを表示するテンプレートを用意しました。このような:

<div class="row">
  <li></li>
  <li></li>
  <li></li>
  <li></li>
</div>
<div class="row">
  <li></li>
  <li></li>
  <li></li>
  <li></li>
</div>

私の XSLT For-each ループでは、4 つのリスト項目のすべてのグループを「div class=row」でラップする方法が必要です。カウントをテストして、どの要素を使用しているかを確認できますが、モジュラスを使用できないため、XSLT で 4 つのグループをラップすることが問題です。

4

1 に答える 1

6

モジュラスを使用できないため、問題は XSLT で 4 つのグループをラップすることです。

反対に。:) あなたが欲しいのはmod operator. さらに、<xsl:for-each>多くの場合、要素は最も再利用可能なアプローチではありません。代わりに、より柔軟なテンプレートを利用するソリューションを検討してください。

この XSLT の場合:

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

  <xsl:variable name="vNumOfElems" select="4"/>

  <xsl:template match="/*">
    <ul>
      <xsl:apply-templates select="li[position() mod $vNumOfElems = 1]"/>
    </ul>
  </xsl:template>

  <xsl:template match="li">
    <div class="row">
      <xsl:copy-of
        select=".|following-sibling::li[not(position() &gt; $vNumOfElems - 1)]"/>
    </div>
  </xsl:template>
</xsl:stylesheet>

...提案されたソース XML に対して適用されます。

<ul>
  <li/>
  <li/>
  <li/>
  <li/>
  <li/>
  <li/>
  <li/>
  <li/>
</ul>

...必要な結果 (有効な HTML のスニフ テストに合格しない可能性があります) が生成されます。

<ul>
  <div class="row">
    <li />
    <li />
    <li />
    <li />
  </div>
  <div class="row">
    <li />
    <li />
    <li />
    <li />
  </div>
</ul>

変数 -- $vNumOfElems-- を使用して、グループ内に含まれる要素の数を保持していることに注意してください。これにより利便性が向上します。将来、たとえば、ごとに 3 つの要素が必要な場合は、単純にその変更を行います。<li><div>

<xsl:variable name="vNumOfElems" select="3" />

...再び正しい結果が得られます:

<ul>
  <div class="row">
    <li />
    <li />
    <li />
  </div>
  <div class="row">
    <li />
    <li />
    <li />
  </div>
  <div class="row">
    <li />
    <li />
  </div>
</ul>
于 2013-04-09T18:54:11.883 に答える