XSLT для отображения элементов в строках - PullRequest
2 голосов
/ 13 февраля 2012

Я столкнулся с загадкой XSLT - вы не можете открыть элемент в одном условном выражении и закрыть его в другом.Я вижу, по-видимому, связанные с этим вопросы в другом месте на Stackoverflow, но ответы немного озадачивают новичка в XSLT с низкой потребляемой мощностью.

В основном я пытаюсь отображать элементы из своего XML в столбцах по всей странице.Сейчас я просто пытаюсь сделать 2 столбца, хотя мне бы хотелось решение, в котором количество столбцов не было бы жестко задано.

Мои данные XML примерно такие, примерно с 100 узлами:

   <?xml version="1.0" encoding="UTF-8"?>
    <response>
        <node type="category">
            <collection>
                <node>
                    <articleId>1</articleId>
                    <headline>Merry Christmas says Google as it unveils animated Jingle Bells Doodle</headline>
                </node>
                <node>
                    <articleId>2</articleId>
                    <headline>Google activating 700,000 Android phones every day</headline>
                </node>
                <node>
                    <articleId>3</articleId>
                    <headline>Google attacked by music industry over 'broken pledges' on illegal downloading</headline>
                </node>
            </collection>
        </node>
    </response>

Я бы хотел перевести это в нечто вроде:

    <div>
        <div class="left">
            [ the articleId ]
            [ the headline ]
        </div>
        <div class="right">
            [ the articleId ]
            [ the headline ]
        </div>
    </div>

со статьей 1 слева, статьей 2 справа, статьей 3 в следующем ряду слева,и т. д. и т. д.

Мы пробовали XSLT следующим образом

<xsl:for-each select="$collection/spi:node[(position() mod $columns) != 0]">
<xsl:variable name="pos" select="position()"/>
<xsl:variable name="node" select="."/>
<div>
    <div class="left">
        <xsl:value-of select="../spi:node[$pos]/spi:articleId"/>]
        <xsl:value-of select="../spi:node[$pos]/spi:headline"/>
    </div>
    <div class="right">
        <xsl:value-of select="../spi:node[$pos + 1]/spi:articleId"/>
        <xsl:value-of select="../spi:node[$pos + 1]/spi:headline"/>
    </div>
</div>
</xsl:for-each>

Но это приводит только к пустым элементам div и странным повторениям статей.Может ли любой гуру XSLT указать нам правильное направление?

Приветствия

1 Ответ

1 голос
/ 13 февраля 2012

Если бы вы выписали значение вашей переменной $ pos , вы обнаружите, что оно равно 1, 2, 3 ... и т. Д., А не 1, 3, ... что к чемуВы можете ожидать.Вот почему вы получаете повторение, я думаю.

На самом деле нет необходимости искать узел , используя переменную $ pos , потому что выбудет уже располагаться на первом узле в паре каждый раз, поэтому все, что вам нужно сделать, это примерно такшаблоны , а не xsl: for-each , так что вы можете переписать его так:

<xsl:template match="/">
   <xsl:variable name="collection" select="response/node/collection"/>
   <xsl:apply-templates 
      select="$collection/spi:node[(position() mod $columns) != 0]" mode="group"/>
</xsl:template>

<xsl:template match="node" mode="group">
   <div>
      <div class="left">
         <xsl:call-template name="spi:node"/>
      </div>
      <div class="right">
         <xsl:apply-templates select="following-sibling::spi:node[1]"/>
      </div>
   </div>
</xsl:template>

<xsl:template name="node" match="node">
   <xsl:value-of select="articleId"/>
   <xsl:value-of select="headline"/>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...