アプリ版:「スタンプのみでお礼する」機能のリリースについて

<A>
 <B>50</B>
 <B>20</B>
 <B>5</B>
 <B>60</B>
 <B>100</B>
</A>

例えば上のようなXMLがあったとします。
それにxslを適用したときに、最小値と最大値のみを表示させたいのですが、xslではどのような処理をすればよいのでしょうか?


<xsl:for-each select="A">
 <xsl:sort select="./B"/>
 <xsl:value-of select="."/>
</xsl:for-each>

上のようだと全ての<B>が昇順に表示されるだけです。
何か最小値、最大値を取得する関数等ありますでしょうか?

A 回答 (1件)

まず、ソートする時にはB要素で繰り返さなくてはなりませんよね。



<xsl:template match="A">
 <table border="1">
  <xsl:for-each select="B">
   <xsl:sort select="." data-type="number"/>
   <tr>
    <td><xsl:value-of select="position()"/></td>
    <td><xsl:value-of select="."/></td>
   </tr>
  </xsl:for-each>
 </table>
</xsl:template>

このようにすると昇順で表示されます
(この例の場合は数字としてソートした方が自然なので、
data-type="number"を指定しました)
一応、HTMLでの出力を想定しています。

昇順にする方法が分かっていれば、最小値最大値を取得するのも容易です。
昇順に並んでいるのですから、その1番目の要素に最小値が、
その最後の要素に最大値が、それぞれ入っていることになります。
それを条件指定で取り出せば良いと思います。

<xsl:template match="A">
 <table border="1">
  <xsl:for-each select="B">
   <xsl:sort select="." data-type="number"/>
   <xsl:if test="position() = 1">
    <tr><td>min</td><td><xsl:value-of select="."/></td></tr>
   </xsl:if>
   <xsl:if test="position() = last()">
    <tr><td>max</td><td><xsl:value-of select="."/></td></tr>
   </xsl:if>
  </xsl:for-each>
 </table>
</xsl:template>

実際はたぶんもっと複雑な事例だとは思いますが、
ここから工夫してみて下さい。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!