2

2 つの値の間にあるノードを持つエントリのみを表示する XSL:IF ステートメントを設定しようとしています。簡単ですよね?それは単に if greater than と if less than です。問題は、1 つのノードに対してテストする代わりに、最大 52 に対してテストする必要があることです。

次のような XML があるとします。

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

ここで、9 ~ 15 の範囲が与えられたとします。一部のノードがその範囲に該当するため、そのエントリを表示したいと思います。しかし、11 ~ 15 の範囲が与えられた場合、どのノードも適合しないため、表示したくありません。

問題は...どうやってこれを行うのかまったくわかりません。単一の値をIFできることは知っていますが、各ノードをテストする簡単な方法は思いつきません。

ちなみに、これはすべて Symphony CMS の最新の安定版リリース内で行われています。

[編集] 最初の 2 つの結果の問題は、ITEM ノードが表示されることです。私が探しているのは、一致する ITEM ノードが少なくとも 1 つある ENTRY ノードのみを返すことです。どのソリューションがこれにどのように役立つかはわかりません。

4

3 に答える 3

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

XPath ステートメント 'container/entry/item' は、一致するすべてのアイテムを参照します。述語 [number(.) >= 9 and number(.) <= 15] は、下にリストする部分を取り除きます。一部の XSLT 操作 (xsl:value-of など) には、最初の値のみを取得する暗黙のフィルターがあります。このような場合、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>
于 2009-06-18T18:31:05.677 に答える
2

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

この式は、「値が 9 ~ 15 の項目を含むエントリ」として読み取られます。

于 2009-06-18T20:32:08.600 に答える
1

これはどうですか....for-eachループ内でやりたいことは何でもできますし、変数で返されたノードセットを取得して別の場所で使用することもできます。

   <?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>
于 2009-06-18T18:41:11.497 に答える