xslt V1.0 - 从子模板返回多个值的最简单方法

Sti*_*len 4 xslt templates return xslt-1.0

我正在寻找一种优雅的方法来从一个子模板返回多个值.

为什么? - 我有一个带有递归循环的子模板,它返回xml中节点的最大值.我还需要min值和节点的总数,我可以从同一个子模板中获得.我没有赢得循环3次,对性能不是很好:)

到目前为止找到的解决方案

  • 创建我需要的3个值的字符串,并获取它们的子字符串.
  • ...

我正在使用xsl v1.0

谢谢

Dim*_*hev 5

访问单个字符串中的每个(例如数百个)结果可能不方便.

在这里,可以最好地看到和利用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>
Run Code Online (Sandbox Code Playgroud)

将此转换应用于以下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>
Run Code Online (Sandbox Code Playgroud)

产生了想要的正确结果:

<results>
   <count>10</count>
   <min>1</min>
   <max>10</max>
</results>
Run Code Online (Sandbox Code Playgroud)

请注意:

  1. 如果结果位于变量的主体中,则变量类型为RTF(结果树片段),并且必须使用该xxx:node-set()函数将其转换为常规树,然后才能单独访问结果的节点.XPath 2.0(XSLT 2.0)中没有这样的限制.

  2. 如此示例所示,即使在XSLT 1.0 中,也不需要递归来生成序列的最大值和最小值.