Frage

Ich versuche, eine XSL einzurichten: IF-Anweisung, die nur zeigt Einträge, die einen Knoten haben, die zwischen zwei Werten. Einfach genug, nicht wahr? Es ist nur ein, wenn mehr als und wenn weniger als. Das Problem ist, statt zu testen es gegen einen Knoten Ich brauche es zu testen gegen bis zu 52.

Lassen Sie uns sagen, dass ich einige XML haben, die wie folgt aussieht:

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

Nun sage ich eine Reihe von 9-15 gegeben habe. Da einige der Knoten in diesen Bereich fallen, möchte ich diesen Eintrag anzuzeigen. Aber wenn ich eine Reihe von 11-15 keinem der Knoten gegeben passen, so würde ich nicht will, dass es angezeigt wird.

Das Problem ist ... Ich habe absolut keine Ahnung, wie Sie dies tun würden. Ich weiß, Sie können, wenn ein einzelner Wert, aber ich nicht eine einfache Art und Weise denken kann jeden Knoten zu testen.

By the way, ist das alles innerhalb der letzten stabilen Version des Symphony CMS getan.

[Bearbeiten] Das Problem mit den ersten beiden Ergebnissen ist, dass sie den ITEM-Knoten anzuzeigen, was ich suche, ist nur ENTRY Knoten zurück, die mindestens ein Element Knoten hat, die übereinstimmt. Ich bin mir nicht sicher, wie eine der Lösungen würde dies helfen.

War es hilfreich?

Lösung

Sie können dies erreichen eine verschachtelte Prädikat auf den <entry> Streichhölzern:

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

Der Ausdruck als „Einträge, welche Elemente, deren Werte zwischen 9 und 15 enthalten“ lesen würde.

Andere Tipps

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

Die XPath-Anweisung 'Container / entry / Punkt' bezieht sich auf alle passenden Artikel. Das Prädikat [Nummer (.)> = 9 und Nummer (.) <= 15] pares diese Liste nach unten. Einige XSLT-Operationen (z.B. xsl: value-of) einen implizierten Filter, der nur den ersten Wert packt. In diesen Fällen können Sie 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>

Wie wäre es damit .... können Sie tun, was Sie wollen innerhalb der für-jede Schleife oder Sie können nur die nodeset nehmen in der Variable zurückgegeben und es irgendwo anders verwendet werden.

   <?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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top