2011-07-31 16 views
3

我正在尋找一種優雅的方式來從一個子模板返回多個值。xslt V1.0 - 從子模板返回多個值的最簡單方法

爲什麼? - 我有一個遞歸循環的子模板,返回XML中節點的最大值。我還需要最小值和我可以從同一子模板獲得的節點總數。我不wonna循環3次,表現不是很好:)

解決方案,我發現迄今:

  • 創建3個值,我需要的字符串,並讓他們的子字符串。
  • ...

我使用XSL 1.0

感謝

+0

好問題,+1。查看我的答案,提供多種結果的另一種方式,這更方便,更自然,尤其是在結果數量很大的情況下。 –

回答

3

它可能不是很方便訪問每個許多(說幾百個)的結果在一個字符串呈現。

這是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中也是如此。

+0

要嘗試這個並向你報告:) –

+1

使用排序的+1。 –

+0

它工作完美,並感謝您的注意! –