2011-08-07 3 views
1

J'ai besoin d'aide pour modifier mes conditions dans xslt.Ajouter une condition dans xslt

J'ai 3 dans mon xsl param

<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 --> 

Mon xsl actuel cherche seulement subcategory et ne cherche pas category.

Mes exigences sont les suivantes:

  • Si categoryID est passé en tant que valeur 0 liste alors toutes les catégories résultat
  • Si categoryID est passé alors le résultat devrait afficher uniquement pour cette catégorie id
  • Si subcategoryID est 0 puis afficher les sous-catégories de résultats sous categoryID seulement
  • Si le subcategoryID est passé, alors le résultat t doit afficher les valeurs de cette sous catégorie particulière, qui est la sous-catégorie sélectionnée
  • Si categoryID et subcategoryID est 0 puis afficher tous les résultats

Le paramètre today est passé de sorte qu'aucun résultat devrait afficher la date passée.

S'il vous plaît me guider dans la fixation de ce xslt. Mon xml et xslt sont ci-dessous

<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 Entrée

<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

Où est la question? –

+0

S'il vous plaît montrer aussi sortie (s) désirée pour rendre la question beaucoup plus claire. –

Répondre

1

Je crois que la condition que vous voulez est la suivante

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

En fait, il est généralement préférable d'utiliser un xsl: apply-templates au lieu de xsl: pour chaque. Il est toujours possible de trier ** xsl dans cette instance.

Voici le XSLT plein

<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> 

Note l'utilisation de la variable pour éviter de faire le même calcul deux fois.

Questions connexes