Question

J'essaie de configurer une instruction XSL: IF qui affiche uniquement les entrées dont le nœud se situe entre deux valeurs. Assez simple, non? C'est juste un si plus grand et si moins que. Le problème, c’est qu'au lieu de le tester sur un noeud, je dois le tester sur un maximum de 52.

Disons que j'ai du XML qui ressemble à ceci:

<container>
    <entry>
        <item>1</item>
        <item>2</item>
        <item>3</item>
        <item>4</item>
        <item>5</item>
        <item>6</item>
        <item>7</item>
        <item>8</item>
        <item>9</item>
        <item>10</item>
    </entry>
</container>

Maintenant, disons que je reçois une plage de 9 & # 8211; 15. Certains nœuds se situant dans cette plage, je souhaite afficher cette entrée. Mais si on me donnait une plage de 11 & # 8211; 15 aucun des noeuds ne me correspondait, je ne voudrais donc pas qu’il soit affiché.

Le problème est ... Je ne sais absolument pas comment vous allez procéder. Je sais que vous pouvez utiliser SI une seule valeur, mais je ne peux pas penser à un moyen simple de tester chaque noeud.

Soit dit en passant, tout cela se fait dans la dernière version stable du CMS Symphony.

[modifier] Le problème avec les deux premiers résultats est qu'ils affichent les nœuds ITEM. Ce que je recherche, c'est de ne renvoyer que les nœuds ENTRY ayant au moins un nœud ITEM correspondant. Je ne suis pas sûr de savoir comment l'une des solutions aiderait cela.

Était-ce utile?

La solution

Vous pouvez y parvenir en utilisant un prédicat imbriqué sur les <entry> correspondances:

.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:for-each select="container/entry[item[number(.) &gt;= 9 and number(.) &lt;= 15]]">
            <!-- this will loop over <entry>s which contain <item>s within your range -->
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

L'expression se lirait comme " entrées contenant des éléments dont les valeurs sont comprises entre 9 et 15 ".

Autres conseils

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:copy-of select="container/entry/item[number(.) &gt;= 9 and number(.) &lt;= 15]"/>
    </xsl:template>
</xsl:stylesheet>

L'instruction XPath 'conteneur / entrée / élément' fait référence à tous les éléments correspondants. Le prédicat [nombre (.) & Gt; = 9 et nombre (.) & Lt; = 15] réduit cette liste. Certaines opérations XSLT (par exemple, xsl: value-of) ont un filtre implicite qui récupère uniquement la première valeur. Dans ces cas, vous pouvez utiliser xsl: for-each:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:for-each select="container/entry/item[number(.) &gt;= 9 and number(.) &lt; 15]">
            <xsl:value-of select="."/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Qu'en est-il de cela .... Vous pouvez faire ce que vous voulez dans la boucle for-each ou vous pouvez simplement prendre le jeu de nœuds retourné dans la variable et l'utiliser ailleurs.

   <?xml version='1.0'?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <!-- Your first param -->
        <xsl:param name="Param1" select="4"/>
        <!-- Your second param -->
        <xsl:param name="Param2" select="9"/>
            <xsl:variable name="ResultNodeSet">
                <xsl:for-each select="/container/entry/item[number(.) &gt;= $Param1 and number(.) &lt;= $Param2]">
                  <!-- What ever else you want to do can go here-->
                  <xsl:copy-of select="."/>
                </xsl:for-each>
            </xsl:variable>  
        <xsl:value-of select="$ResultNodeSet"/>
    </xsl:template> 
    </xsl:stylesheet>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top