Pregunta

Estoy tratando de configurar una declaración XSL: IF que solo muestra entradas que tienen un nodo que se encuentra entre dos valores. Bastante simple, ¿verdad? Es solo un si mayor que y si menor que. El problema es que, en lugar de probarlo en un nodo, necesito probarlo en hasta 52.

Digamos que tengo un XML que se ve así:

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

Ahora di que tengo un rango de 9 & # 8211; 15. Debido a que algunos de los nodos caen en ese rango, quiero mostrar esa entrada. Pero si me dieran un rango de 11 & # 8211; 15 ninguno de los nodos encaja, así que no me gustaría que se muestre.

El problema es ... No tengo ni idea de cómo harías esto. Sé que puede SI un solo valor, pero no puedo pensar en una forma simple de probar cada nodo.

Por cierto, todo esto se hace dentro de la última versión estable de Symphony CMS.

[editar] El problema con los dos primeros resultados es que muestran los nodos ITEM, lo que estoy buscando es devolver solo los nodos ENTRY que tengan al menos un nodo ITEM que coincida. No estoy seguro de cómo alguna de las soluciones ayudaría a esto.

¿Fue útil?

Solución

Puede lograr esto utilizando un predicado anidado en las <entry> coincidencias:

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

La expresión se leería como " entradas que contienen elementos cuyos valores están entre 9 y 15 " ;.

Otros consejos

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

La declaración XPath 'contenedor / entrada / elemento' se refiere a todos los elementos coincidentes. El predicado [número (.) & Gt; = 9 y número (.) & Lt; = 15] empareja esa lista. Algunas operaciones XSLT (por ejemplo, xsl: value-of) tienen un filtro implícito que solo toma el primer valor. En estos casos, puede usar 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é tal esto? ... Puedes hacer lo que quieras dentro del ciclo for-each o simplemente puedes tomar el conjunto de nodos devuelto en la variable y usarlo en otro lugar.

   <?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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top