Pergunta

Eu estou tentando configurar um XSL: declaração IF que só mostra entradas que têm um nó que cai entre dois valores. bastante simples, certo? É apenas um caso maior do que e se menos de. O problema é que, em vez de testá-lo contra um nó eu preciso testá-lo contra até 52.

Vamos dizer que tenho alguns XML que se parece com isso:

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

Agora dizem que eu sou dado um intervalo de 9-15. Porque alguns de nós cair nessa faixa eu quero mostrar essa entrada. Mas se me foi dada uma gama de 11-15 nenhum dos nós caber então eu não gostaria que fosse exibido.

O problema é ... Eu não tenho absolutamente nenhuma idéia de como você faria isso. Eu sei que você pode se um único valor, mas eu não posso pensar de uma maneira simples para testar cada nó.

A propósito, isso é tudo o que está sendo feito dentro da mais recente versão estável do Symphony CMS.

[editar] O problema com os dois primeiros resultados é que eles exibir os nós de itens, o que eu estou procurando é para retornar apenas os nós de entrada que têm pelo menos um nó item que corresponde. Eu não sei como qualquer uma das soluções ajudaria isso.

Foi útil?

Solução

Você pode fazer isso usando um predicado aninhado nas partidas <entry>:

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

A expressão seria lido como "entradas que contêm itens cujos valores são entre 9 e 15".

Outras dicas

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

A declaração XPath 'recipiente / entry / item de' refere-se a todos os artigos relacionados. O predicado [número (.)> = 9 e número (.) <= 15] Pares essa lista para baixo. Algumas operações XSLT (por exemplo, XSL: valor-de) tem um filtro implícito que apenas agarra o primeiro valor. Nestes casos, você pode 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>

Como sobre isso .... Você pode fazer o que quiser dentro do para-cada loop ou você pode simplesmente pegar o nodeset retornado na variável e usá-lo em outro 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top