2009-06-18 31 views
2

2つの値の間にあるノードを持つエントリのみを表示するXSL:IF文を設定しようとしています。十分に簡単ですね。それはちょうどaよりも大きい場合と少ない場合です。再帰的なXSLの作成:If文?

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

は今、私は範囲を与えてると言う:問題ではなく、一つのノードに対してそれをテストする私はのは、私はこのようになりますいくつかのXMLを持っているとしましょう、最大52

に対してそれをテストする必要があり、 9-15のノードのいくつかがその範囲に入るので、そのエントリを表示したい。しかし、私が11-15の範囲を与えられていればノードのどれも適合しないので、私はそれを表示したくないでしょう。

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

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

[編集] 最初の2つの結果の問題は、ITEMノードを表示することです。私が探しているのは、一致する少なくとも1つのITEMノードを持つENTRYノードだけを返すことです。私はどのような解決法がこれを助けてくれるかわからない。

答えて

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の間にあるアイテムが含まれているエントリ」と読んでいました。

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'は、一致するすべての項目を参照します。述語[番号(。)> = 9と番号(。)< = 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> 
+2

@ steamer25:それは、+1です。 @dougoftheabaci:XPathで角括弧が見えるときはいつでも、 "WHERE"(SQLのように)を考えるのが最善です。この解決策では、XPathは「SELECT item from container/entry WHERE value> = 9 AND value <= 15」と解釈されます。これは、SQLステートメントと同様に、セットベースの操作です。 – Tomalak

1

これについて....あなたはのために、各ループの内側にやりたいことができますまたはあなただけで返されたノードセットを取ることができますどのように他の場所で使用してください。

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

は、愚かなxsltを表示するために5回編集しました。 –

関連する問題