質問

ノードが2つの値の間にあるエントリのみを表示するXSL:IFステートメントを設定しようとしています。簡単ですよね?それは、もしより大きいなら、そしてより小さいなら、ただです。問題は、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 <!>#8211; 15の範囲が与えられていると言います。一部のノードがその範囲に入るため、そのエントリを表示したいと思います。しかし、11 <!>#8211; 15の範囲が与えられた場合、どのノードも適合しないため、表示したくありません。

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

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

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

役に立ちましたか?

解決

<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 <!> quot;のアイテムを含む<!> quot; entriesとして読み取られます。

他のヒント

<?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(。)<!> gt; = 9およびnumber(。)<!> lt; = 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>

これについてはどうでしょうか。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>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top