xslt V1.0 - самый простой способ вернуть несколько значений из подшаблона - PullRequest
4 голосов
/ 31 июля 2011

Я ищу элегантный способ вернуть несколько значений из одного подшаблона.

почему? - у меня есть подшаблон с рекурсивным циклом, который возвращает максимальное значение узла в xml. Мне также нужно минимальное значение и общее количество узлов, которые я могу просто получить из того же подшаблона. Я не буду повторять петлю 3 раза, не очень хорошо для исполнения :) 1005 *

Решения, которые я нашел до сих пор:

  • Создайте строку из 3 необходимых мне значений и получите их подстроку.
  • ...

Я использую xsl v1.0

Спасибо

1 Ответ

5 голосов
/ 31 июля 2011

Может быть неудобно получать доступ к каждому из множества (скажем, сотен) результатов, представленных в одной строке .

Именно здесь мощь XML и XPath может быть наилучшейувиденный и использованный: создайте дерево XML как результат .

Вот пример:

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

 <xsl:template match="/*">
      <xsl:call-template name="sequenceStatistics">
       <xsl:with-param name="pSeq" select="*"/>
      </xsl:call-template>
 </xsl:template>

 <xsl:template name="sequenceStatistics">
  <xsl:param name="pSeq"/>

  <xsl:variable name="vCount" select="count($pSeq)"/>

  <results>
   <count><xsl:value-of select="$vCount"/></count>
    <xsl:for-each select="$pSeq">
     <xsl:sort data-type="number"/>
     <xsl:choose>
       <xsl:when test="position() = 1">
         <min><xsl:value-of select="."/></min>
       </xsl:when>
       <xsl:when test="position() = $vCount">
         <max><xsl:value-of select="."/></max>
       </xsl:when>
     </xsl:choose>
    </xsl:for-each>
  </results>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к следующему документу XML :

<nums>
  <num>7</num>
  <num>3</num>
  <num>9</num>
  <num>10</num>
  <num>4</num>
  <num>2</num>
  <num>5</num>
  <num>08</num>
  <num>6</num>
  <num>1</num>
</nums>

желаемый, правильный результат получен :

<results>
   <count>10</count>
   <min>1</min>
   <max>10</max>
</results>

Примечание :

  1. Если результат находится в теле переменной, тип переменной - RTF (Фрагмент дерева результатов), и он должен быть преобразован в обычное дерево с помощью функции xxx:node-set() перед узлами.результата можно получить индивидуально.В XPath 2.0 (XSLT 2.0) такого ограничения нет.

  2. Как показывает этот пример, нет необходимости в рекурсии для получения максимума и минимума последовательности - даже в XSLT 1.0.

...