2011-08-07 45 views
1

我需要幫助來修改我在xslt中的條件。在xslt中添加條件

我有3個PARAM在我的XSL

<xsl:param name="today" select="'19470815'" /> <!-- this is date in yyyyMMdd format -->  
<xsl:param name="categoryID"/> <!-- This is CATEGORYID in xml file --> 
<xsl:param name="subCategoryID"/> <!-- This is SUBCATEGORYID in xml file --> 

我當前的XSL只查找subcategory,不找category

我的要求是:

  • 如果categoryID作爲價值0傳遞然後列出所有類別導致
  • 如果categoryID傳遞,那麼結果應該如果subcategoryID0該類別的ID只顯示
  • 然後顯示結果小類categoryID
  • 如果特定subcategoryID通過那麼結果噸應該從該特定子類別,附帶選擇子類別下顯示值
  • 如果categoryIDsubcategoryID0然後顯示today參數被傳遞,使得沒有過去的日期結果應顯示的所有結果

請指導我修復這個xslt。我的XML和XSLT低於

<xsl:choose> 
    <xsl:when test="$type = 'open' "> 

     <xsl:for-each select="//SUMMARYNODE[SUMMARY/SUBCATEGORYID = $subCategoryID and SUMMARY/FORMATTEDDATE >= $today] "> 
      <xsl:sort select="SUMMARY/FORMATTEDDATE " /> 
      SOME STUFF 
     </xsl:for-each> 
     <xsl:if test="count(//SUMMARYNODE[SUMMARY/SUBCATEGORYID = $subCategoryID and SUMMARY/FORMATTEDDATE >= $today]) >= 1 "> 
      SOME MORE STUFF 
     </xsl:if> 
     <xsl:if test="not (count(//SUMMARYNODE[SUMMARY/SUBCATEGORYID = $subCategoryID and SUMMARY/FORMATTEDDATE >= $today])>=1) "> 
      NO RECORDS AVAILABLE 
     </xsl:if> 

    </xsl:when> 

</xsl:choose> 

XML輸入

<root> 

    <SUMMARYNODE> 
     <SUMMARY>   
      <CATEGORY CATEGORYID="2">OPERATIONS PROCUREMENT</CATEGORY> 
      <SUBCATEGORYID>4</SUBCATEGORYID>    
     </SUMMARY> 

    </SUMMARYNODE> 


    <SUMMARYNODE> 
     <SUMMARY>   
      <CATEGORY CATEGORYID="2">XYZ</CATEGORY> 
      <SUBCATEGORYID>6</SUBCATEGORYID>    
     </SUMMARY> 

    </SUMMARYNODE> 

    <SUMMARYNODE> 
     <SUMMARY>   
      <CATEGORY CATEGORYID="5">ABC</CATEGORY> 
      <SUBCATEGORYID>8</SUBCATEGORYID>    
     </SUMMARY> 

    </SUMMARYNODE> 

</root> 
+0

問題在哪裏? –

+0

請也顯示想要的輸出(s)使問題更清楚。 –

回答

1

我相信你想要的條件爲

<xsl:for-each select="//SUMMARYNODE 
    [SUMMARY/CATEGORY/@CATEGORYID = $categoryID or $categoryID = '0'] 
    [SUMMARY/SUBCATEGORYID = $subCategoryID or $subCategoryID = '0'] 
    [SUMMARY/FORMATTEDDATE >= $today]"> 

實際上如下,通常最好使用XSL:應用模板而不是xsl:for-each。在這種情況下,仍然可以** xsl:sort。

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:param name="today" select="'19470815'"/> 
    <xsl:param name="categoryID" select="0"/> 
    <xsl:param name="subCategoryID" select="0"/> 

    <xsl:template match="/root"> 
     <xsl:apply-templates select="SUMMARYNODE 
     [SUMMARY/CATEGORY/@CATEGORYID = $categoryID or $categoryID = '0'] 
     [SUMMARY/SUBCATEGORYID = $subCategoryID or $subCategoryID = '0'] 
     [SUMMARY/FORMATTEDDATE >= $today]"> 
     <xsl:sort select="SUMMARY/FORMATTEDDATE "/> 
     </xsl:apply-templates> 

     <xsl:variable name="recordCount" select="count(SUMMARYNODE   
     [SUMMARY/CATEGORY/@CATEGORYID = $categoryID or $categoryID = '0'] 
     [SUMMARY/SUBCATEGORYID = $subCategoryID or $subCategoryID = '0'] 
     [SUMMARY/FORMATTEDDATE >= $today])"/> 
     <xsl:if test="$recordCount > 1"> SOME MORE STUFF </xsl:if> 
     <xsl:if test="$recordCount = 0"> NO RECORDS AVAILABLE </xsl:if> 
    </xsl:template> 

    <xsl:template match="SUMMARYNODE"> 
    SOME STUFF 
    </xsl:template> 
</xsl:stylesheet> 

注意變量的使用,以避免做同樣的計算兩次。