我正在寻找一种优雅的方法来从一个子模板返回多个值。
为什么? -我有一个带有递归循环的子模板,该子模板返回xml中节点的最大值。我还需要可以从同一子模板中简单获取的节点的最小值和总数。我不会重复3次循环,对性能并不是很好:)
我到目前为止发现的解决方案:
创建一个我需要的3个值的字符串,并获取它们的子字符串。
...
我正在使用xsl v1.0
谢谢
最佳答案
访问单个字符串中显示的许多结果(例如数百个结果)可能并不方便。
这是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>
注意事项:
如果结果在变量的主体中,则变量类型为RTF(结果树片段),必须使用
xxx:node-set()
函数将其转换为常规树,然后才能分别访问结果的节点。 XPath 2.0(XSLT 2.0)中没有这样的限制。如本示例所示,即使在XSLT 1.0中,也无需递归即可产生序列的最大值和最小值。