2011-08-07 48 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> 

注意变量的使用,以避免做同样的计算两次。