Подсчет количества «хитов» для каждого - PullRequest
3 голосов
/ 18 февраля 2010

У меня есть код ниже. Я бы хотел, чтобы for-each прекратил работу после того, как if-предложения вернули true и выполнили кодовый блок 4 раза. Поскольку я понятия не имею, когда блок кода был выполнен 4 раза, я не могу использовать position (), что было моей первой идеей.

Любая помощь будет принята с благодарностью.

<xsl:for-each select="$itm//item[@template='news item']">
    <xsl:sort select="sc:fld('start date',.)" data-type="text" order="descending"/>
    <xsl:if test="sc:formatdate($date,'yyyyMMddHHmm') &gt; sc:formatdate(sc:fld('start date',.),'yyyyMMddHHmm')">
        <xsl:if test="sc:formatdate($date,'yyyyMMddHHmm') &lt; sc:formatdate(sc:fld('end date',.),'yyyyMMddHHmm')">
    <!--EXECUTE A CODE BLOCK-->
        </xsl:if>
    </xsl:if>
</xsl:for-each>

Ответы [ 4 ]

1 голос
/ 18 февраля 2010
<!-- convenience variables -->
<xsl:variable name="dtFormat" select="'yyyyMMddHHmm'" />
<xsl:variable name="theDate" select="sc:formatdate($date, $dtFormat)" />

<!-- don't loop over nodes testing a condition on each one separately, 
     just select the interesting ones directly -->
<xsl:variable name="MatchingFields" select="
  $itm//item[@template='news item'][
    sc:formatdate(sc:fld('start date', .), $dtFormat) &lt; $theDate
    and
    sc:formatdate(sc:fld('end date', .), $dtFormat) &gt; $theDate
  ]
" />

<!-- now do something with the nodes -->
<xsl:for-each select="$MatchingFields">
  <xsl:sort select="sc:fld('start date',.)" data-type="text" order="descending"/>
  <!--EXECUTE A CODE BLOCK-->
</xsl:for-each>

<!-- you can also count them (this is your "hit counter") -->
<xsl:value-of select="count($MatchingFields)" />
0 голосов
/ 18 февраля 2010

Не можете ли вы поместить условия в предикат выражения select и позицию использования в for-each, как показано ниже:

<xsl:for-each select="$itm//item[@template='news item'][sc:formatdate($date,'yyyyMMddHHmm') &gt; sc:formatdate(sc:fld('start date',.),'yyyyMMddHHmm')][sc:formatdate($date,'yyyyMMddHHmm') &lt; sc:formatdate(sc:fld('end date',.),'yyyyMMddHHmm')]">
    <xsl:sort select="sc:fld('start date',.)" data-type="text" order="descending"/>
    <xsl:if test="position() &lt; 5">
      <!-- output something -->
    </xsl:if>
</xsl:for-each>
0 голосов
/ 18 февраля 2010

Ну, вы не можете "выйти" из цикла for в xlst ( см. Ссылку ). Так что вам придется по-другому:

  1. Измените оператор выбора так, чтобы for-each перебирал только четыре элемента, для которых вы хотите выполнить свой код.
  2. Использовать рекурсию (используя call-template или apply-template и параметр, передаваемый в шаблон с помощью with-param). Для каждой рекурсии вы можете увеличивать параметр, если блок кода был выполнен до его передачи на следующий уровень рекурсии. Вы должны проверить, равен ли параметр 4, прежде чем перейти на следующий уровень рекурсии (т. Е. Условие выхода для рекурсивной функции).

    <!-- exit condition -->
    <xsl:if test="$executed &lt; 4">
        <!-- check conditions and select next item -->
        <xsl:choose>
            <!-- condition for items where the code should be executed -->
            <xsl:when test="test whether code should be executed">
                <!-- execute your code here -->
                <xsl:apply-templates select="select next item" mode="recursive">
                    <xsl:with-param name="executed" select="$executed + 1"/>
                </xsl:apply-templates>
            </xsl:when>
            <!-- condition for items where the code should not be executed -->
            <xsl:otherwise>
                <xsl:apply-templates select="select next item" mode="recursive">
                    <xsl:with-param name="executed" select="$executed"/>
                </xsl:apply-templates>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:if>
    

0 голосов
/ 18 февраля 2010

Нет, поскольку xslt не является процедурным языком, оператор, так сказать, работает параллельно, получая все данные одновременно и затем отображая их. поэтому он не знает итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...