XSLT продвигать узел без использования for-each - PullRequest
0 голосов
/ 21 июля 2011

Довольно зеленый в XSLT, и одна из систем, над которой я работаю, использует его для генерации некоторых таблиц во внешнем интерфейсе.В основном, выполняя запрос к экземпляру db2, результирующий набор анализируется в xml, а результат выглядит примерно так:петляЭто из моего понимания переменных внутри XSLT (который ограничен).

В конце страницы я должен создать таблицу, используя переменные, которые я создал выше.Что предполагается из набора результатов, так это то, что он вернет три строки и больше / меньше.Часть кода из моего xslt выглядит следующим образом ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>
    <xsl:template match="/">
    ....after some html population...
    <tbody>
        <tr>
            <td>Column</td>
                <td class="rightAligned">
                    <xsl:call-template name="formatAsCurrencyNoDecimals">
                        <xsl:with-param name="numberToFormat" 
                            select="summarizedLoads/summary/total" />
                    </xsl:call-template>
                </td>
                .....xsl continues for this row....

Как только это будет сделано, что нужно сделать, чтобы перейти к следующей строке?Я подумал, что мне нужно изменить соответствие корневого шаблона на <xsl:template match="/summarizedLoads/"> и затем вызывать его после каждой строки.

Внутри каждой строки мне нужно будет создать несколько переменных для использования в конце.

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

Ответы [ 2 ]

1 голос
/ 21 июля 2011

Предположим, у вас есть следующий XML:

<root>
  <row>1</row>
  <row>2</row>
  <row>3</row>
  <row>4</row>
  <row>5</row>
</root>

Чтобы выбрать только 3 строки, вы можете использовать XPath: //row[position() &lt; 4], например XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <xsl:apply-templates select="//row[position() &lt; 4]"/>
  </xsl:template>

  <xsl:template match="row">
    <xsl:copy-of select="."/>
  </xsl:template>

</xsl:stylesheet>

Вывод должен быть:

<row>1</row>
<row>2</row>
<row>3</row>
0 голосов
/ 21 июля 2011

Самое приятное в XSLT - использование вложенных шаблонов.У вас уже есть один шаблон;давайте сделаем еще один ниже того, который у вас есть, где match = "Row".В этом шаблоне делайте все свои специфичные для строки вещи.Затем вызовите его из вашего основного шаблона (match = "/"), где вы хотите, чтобы ваши последние строки были такими:

<xsl:apply-templates select = "./Row[0]"/>
<xsl:apply-templates select = "./Row[1]"/>
<xsl:apply-templates select = "./Row[2]"/>

Если бы вы хотели, чтобы все строки вместо только первых 3, вы бысделайте это вместо:

<xsl:apply-templates select = "./Row"/>

Точка обозначает текущий элемент.Поскольку мы находимся в основном шаблоне, это корневой элемент ResultSet./ Row означает, что мы применяем первый шаблон, который соответствует Row, ко всем элементам Row потомка.

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