再帰的なXSL:Ifステートメントを作成しますか?
-
06-07-2019 - |
質問
ノードが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(.) >= 9 and number(.) <= 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(.) >= 9 and number(.) <= 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(.) >= 9 and number(.) < 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(.) >= $Param1 and number(.) <= $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>