2011-03-21 52 views
2

我可以在XSLT 1中的變量中使用max函數嗎? 我需要在一些節點內找到最大值,我需要從更多地方調用此值。 所以我試圖創建一個模板:在XSLT 1.0中的變量中使用max

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:essox="urn:essox-scripts"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template name="Field001_max_dluznych_splatek"> 
     <xsl:param name="CrRep"/> 
     <xsl:variable name="PocetDluznychSplatekSplatky"> 
      <xsl:value-of 
      select="max($CrRep 
         /Response 
          /ContractData 
          /Installments 
          /InstDetail 
          /NrOfDueInstalments)" /> 
     </xsl:variable> 
     <xsl:variable name="PocetDluznychSplatekKarty"> 
      <xsl:value-of 
      select="max($CrRep 
          /Response 
          /ContractData 
          /Cards 
          /CardDetail 
           /NrOfDueInstalments)" /> 
     </xsl:variable> 
     <xsl:choose> 
      <xsl:when test="$PocetDluznychSplatekSplatky 
          &gt;= $PocetDluznychSplatekKarty"> 
       <xsl:value-of select="$PocetDluznychSplatekSplatky"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$PocetDluznychSplatekKarty"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

在XML間諜,我得到這個錯誤:

Error in XPath expression Unknown function - Name and number of arguments do not match any function signature in the static context - 'max'.

有什麼不對? 非常感謝, Peter

+0

非常感謝您的回答和建議。 – Petr 2011-03-22 10:14:29

回答

3

使用衆所周知的最大的成語:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:essox="urn:essox-scripts"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template name="Field001_max_dluznych_splatek"> 
     <xsl:param name="CrRep"/> 
     <xsl:variable name="PocetDluznychSplatekSplatky"> 
      <xsl:call-template name="maximun"> 
       <xsl:with-param name="pSequence" 
       select="$CrRep 
          /Response 
          /ContractData 
          /Installments 
          /InstDetail 
           /NrOfDueInstalments"/> 
      </xsl:call-template> 
     </xsl:variable> 
     <xsl:variable name="PocetDluznychSplatekSplatky"> 
      <xsl:call-template name="maximun"> 
       <xsl:with-param name="pSequence" 
       select="$CrRep 
          /Response 
          /ContractData 
          /Cards 
          /CardDetail 
           /NrOfDueInstalments"/> 
      </xsl:call-template> 
     </xsl:variable> 
     <xsl:choose> 
      <xsl:when test="$PocetDluznychSplatekSplatky 
          &gt;= $PocetDluznychSplatekKarty"> 
       <xsl:value-of select="$PocetDluznychSplatekSplatky"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$PocetDluznychSplatekKarty"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
    <xsl:template name="maximun"> 
     <xsl:param name="pSequence"/> 
     <xsl:for-each select="$pSequence"> 
      <xsl:sort select="." data-type="number" order="descending"/> 
      <xsl:if test="position()=1"> 
       <xsl:value-of select="."/> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

注意:以備重新命名模板。

1

XSLT 1.0中沒有max函數。您可以通過按降序對元素進行排序,然後採用第一個元素的值來解決此問題。

這裏的另一種(慢)的方式來做到這一點:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:variable name="PocetDluznychSplatekSplatky" 
     select="/test/PocetDluznychSplatekSplatky/val[not(../val &gt; .)][1]" /> 
    <xsl:variable name="PocetDluznychSplatekKarty" 
     select="/test/PocetDluznychSplatekKarty/val[not(../val &gt; .)][1]" /> 
    <xsl:template match="/"> 
     <xsl:choose> 
      <xsl:when 
       test="$PocetDluznychSplatekSplatky &gt;= 
         $PocetDluznychSplatekKarty"> 
       <xsl:value-of select="$PocetDluznychSplatekSplatky" /> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$PocetDluznychSplatekKarty" /> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

示例源文件:

<test> 
    <PocetDluznychSplatekSplatky> 
     <val>22</val> 
     <val>3241</val> 
     <val>13</val> 
    </PocetDluznychSplatekSplatky> 
    <PocetDluznychSplatekKarty> 
     <val>1</val> 
     <val>3234341</val> 
     <val>13</val> 
    </PocetDluznychSplatekKarty> 
</test> 

輸出:

3234341 

中的每個變量的select中的XPath看起來像這樣:

/test/PocetDluznychSplatekSplatky/val[not(../val &gt; .)][1] 

或者,選擇val元素,其中沒有val兄弟姐妹具有較大的值(即,最大)。

(顯然,你需要調整的XPath,以適應您的源文件。)

注:sort解決方案進行更好的(假設n*log(n)排序實現)。第二種方法需要比較每個val與其所有兄弟姐妹,因此是二次方。

+0

非常感謝您的回答!我怎樣才能做到這一點?我可以在xslt中對元素進行排序,但我不知道如何對它們進行排序並將第一個值放入一個變量中。 – Petr 2011-03-21 15:46:20

+0

下面是一個可能有所幫助的例子:http://stackoverflow.com/questions/415934/xslt-max-node-value-problem – 2011-03-21 15:55:09

+0

感謝@AakashM的第二種方法,我認爲這是一個更完整的例子。請參閱:http://stackoverflow.com/questions/2021667/how-to-get-equivalent-of-max-on-msxml6 – 2011-03-21 16:21:31