подсчитать количество элементов в цикле XSL для каждого? - PullRequest
1 голос
/ 02 декабря 2010

В течение прошедшего дня я пытался выяснить, как подсчитать количество элементов в цикле XSL для каждого.Я пытался сделать это с помощью JavaScript, но не могу заставить его работать.Я не уверен, что это просто вопрос неправильного отображения вывода или вы можете даже сделать это с помощью XSLT.Любая помощь будет оценена.Это неприятная ошибка, к которой я не был готов.

<script type="text/javascript">
var colATotal=0;

function loopCounterA(){
  colATotal++;
}

function printA(){
   document.write(colATotal);
}
</script>

<xsl:for-each select='bookmarks/category'>
<xsl:for-each select='./bookmark'>

<script type="text/javascript">
loopCounterA(); 
printA();
</script>

</xsl:for-each>
</xsl:for-each>

Из комментариев:

Я понял, что весь код может быть пустой тратой времени.У меня есть столбец divA и столбец divB, оба из которых являются вертикальными столбцами.Мой босс хочет, чтобы все закладки были перенесены, но я не могу начать перенос в середине блока категорий.Мое намерение состоит в том, чтобы отслеживать 3 переменные: общее количество закладок в столбце A на данный момент (A), общее количество закладок в столбце B на данный момент (B) и количество закладок в следующем блоке категории, который нужно разместить (C).если B + C больше, чем A, я помещу блок в columnA, а в противном случае - в columnB.Это имеет больше смысла сейчас?Огромное спасибо.

Ответы [ 3 ]

3 голосов
/ 03 декабря 2010

Эта таблица стилей (ваш алгоритм):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="bookmarks">
        <html>
            <xsl:apply-templates select="category[1]"/>
        </html>
    </xsl:template>
    <xsl:template match="category">
        <xsl:param name="pColumnA" select="/.."/>
        <xsl:param name="pColumnB" select="/.."/>
        <xsl:variable name="vTest" select="count($pColumnB/bookmark|bookmark)
                                           > count($pColumnA/bookmark)"/>
        <xsl:variable name="vColumnA" select="$pColumnA|self::*[$vTest]"/>
        <xsl:variable name="vColumnB" select="$pColumnB|self::*[not($vTest)]"/>
        <xsl:variable name="vNext" select="following-sibling::category[1]"/>
        <xsl:apply-templates select="$vNext">
            <xsl:with-param name="pColumnA" select="$vColumnA"/>
            <xsl:with-param name="pColumnB" select="$vColumnB"/>
        </xsl:apply-templates>
        <xsl:if test="not($vNext)">
            <div id="ColumnA">
                <xsl:copy-of select="$vColumnA"/>
            </div>
            <div id="ColumnB">
                <xsl:copy-of select="$vColumnB"/>
            </div>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<bookmarks>
    <category id="a">
        <bookmark id="1"/>
        <bookmark id="2"/>
        <bookmark id="3"/>
    </category>
    <category id="b">
        <bookmark id="4"/>
        <bookmark id="5"/>
    </category>
    <category id="c">
        <bookmark id="6"/>
        <bookmark id="7"/>
        <bookmark id="8"/>
        <bookmark id="9"/>
        <bookmark id="10"/>
    </category>
    <category id="d">
        <bookmark id="11"/>
        <bookmark id="12"/>
        <bookmark id="13"/>
        <bookmark id="14"/>
        <bookmark id="15"/>
    </category>
</bookmarks>

Выход:

<html>
    <div id="ColumnA">
        <category id="a">
            <bookmark id="1"></bookmark>
            <bookmark id="2"></bookmark>
            <bookmark id="3"></bookmark>
        </category>
        <category id="c">
            <bookmark id="6"></bookmark>
            <bookmark id="7"></bookmark>
            <bookmark id="8"></bookmark>
            <bookmark id="9"></bookmark>
            <bookmark id="10"></bookmark>
        </category>
    </div>
    <div id="ColumnB">
        <category id="b">
            <bookmark id="4"></bookmark>
            <bookmark id="5"></bookmark>
        </category>
        <category id="d">
            <bookmark id="11"></bookmark>
            <bookmark id="12"></bookmark>
            <bookmark id="13"></bookmark>
            <bookmark id="14"></bookmark>
            <bookmark id="15"></bookmark>
        </category>
    </div>
</html>
1 голос
/ 02 декабря 2010

Используйте функцию count() XPath для предиката в атрибуте select.

0 голосов
/ 02 декабря 2010

Вы можете использовать функцию count() и использовать ее для упрощения JavaScript. Не нужно перебирать XML для генерации JavaScript, который вызывается n раз для получения счетчика.

<script type="text/javascript">
var colATotal=<xsl:value-of select='count(bookmarks/category/bookmark)'>;

function printA(){
   document.write(colATotal);
}

printA();

</script>

Если цель поместить его в JavaScript - это просто превратить его в HTML с подсчетом, и вы просто использовали JavaScript для создания нужного HTML (и не могли понять, как это сделать в XSLT ), попробуйте спросить, как это сделать в XSLT .

Это не так сложно, как вы можете себе представить, это просто сделано иначе, чем вы привыкли. XSLT - это декларативный стиль программирования, и вы подходите к нему как к процедурному программисту.

Вы можете просто выбрать количество элементов и поместить их непосредственно в ваш вывод HTML, например ::11013*

<b>The total count of bookmarks is:</b> <xsl:value-of select='count(bookmarks/category/bookmark)'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...