<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で質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルで特定のマイナス値を除く最大値と最小値について

エクセルで、ある特定の値(-99999)を除く最大値と最小値を

=MAX(IF(A1:A10<>-99999,A1:A10,""))
=MIN(IF(A1:A10<>-99999,A1:A10,""))

の配列数式を使って求めました。

ただ、A1:A10がすべて-99999の場合、0がかえってきてしまいます。
この場合、-99999と表示するにはどのようにすればよいのでしょうか?

1つの式で、上記2つの処理をするにはどのようにすればよいのでしょうか?

Aベストアンサー

修行中の身なので『指導』は勘弁してください。:D

>最大値は-99999以外の値がすべてマイナス値の場合に0がかえってきてしまいます。
提示の式
>=MAX(IF(A1:A10<>-99999,A1:A10,""))
これでも同じですよね?
なので空白セルはないと判断しました。

あるなら、ベタですが
=IF(AND(A1:A10=-99999),-99999,MAX(IF(A1:A10<>-99999,IF(A1:A10<>"",A1:A10,""))))
の配列数式で。

#他の方の案もお待ちになられたほうが良いかもしれません。

Q単独

お世話になります。

現在、サンプルのXSLTスタイルシート内を解析中なのですが、
各テンプレート内に、
<xsl:apply-templates />という単独での要素が、
いくつも出てきます。

ネット上で調べてみたところ、
「ほかのテンプレートの処理に移ることが出来る」
ということのようですが、
いまいち、この単独での要素を、
記述する意味が、よくわかりません。
(最近、XSLTを本で勉強しはじめたばかりなのですが、
  その本には、”<xsl:apply-templates select="mains">”みたいな例しか掲載されておらず、
  <xsl:apply-templates />という単独での説明が、残念ながら存在しておりませんでした・・・)

そこでご質問内容ですが、
XSLTスタイルシート内のテンプレート内に、
<xsl:apply-templates />という単独で、
で記述するのは、
どのようなことを実現させたいときに、
記述しているのでしょうか?

以上になります。
出来ましたら、例などを出していただきまして、
具体的に理解しやすく教えていただけますと
助かります。
どうぞよろしくお願いします。

お世話になります。

現在、サンプルのXSLTスタイルシート内を解析中なのですが、
各テンプレート内に、
<xsl:apply-templates />という単独での要素が、
いくつも出てきます。

ネット上で調べてみたところ、
「ほかのテンプレートの処理に移ることが出来る」
ということのようですが、
いまいち、この単独での要素を、
記述する意味が、よくわかりません。
(最近、XSLTを本で勉強しはじめたばかりなのですが、
  その本には、”<xsl:apply-templates select="mains">”みたいな例しか掲載されておらず、
  <xs...続きを読む

Aベストアンサー

わからないときは、仕様で確認するといいかも。
「select 属性が無いときは、カレントノードの全ての子ノード」ってかいてあったよ?

5.4 Applying Template Rules - XSL Transformations (XSLT)
→ http://www.w3.org/TR/xslt/#section-Applying-Template-Rules

「In the absence of a select attribute, the xsl:apply-templates instruction processes all of the children of the current node, including text nodes.」


だから、
select="node()"
の省略とみなして、いい気がする。

Q(EXCEL)最大値、最小値を除いた平均

たとえばA1、A2・・A4、A5にある測定値が入っています。
この中で最大値と最小値を除いた平均値をA6に入れたいのですが、どのような式を入れたらよろしいでしょうか?

よろしくお願い致します。

Aベストアンサー

こんな式でどうでしょうか。
ちょっと長いですが。

=(SUM(A1:A5)-MAX(A1:A5)-MIN(A1:A5))/(COUNT(A1:A5)-2)

Q

の使い方

xhtml+cssをやり始めです。

実は、<br />と<p></p>の使い方についてわかんなくて教えてくださーい。

普通のhtmlでは改行したいときは、<br />を入れまくっていましたが、xhtmlは<br/>ではなく改行は<p></p>でといわれました。

<p>あいうえお</p>
<p>かきくけこ</p>

といれると改行にはなりますが、1行あけたい場合はどうしますか?

<p>あいうえお</p>
<p></p>
<p>かきくけこ</p>

としても1行あきませんよね?
こういう場合は

<p>あいうえお</p>
<br />
<p>かきくけこ</p>

でいいのですかね???

単純な質問ですみません。

Aベストアンサー

基本的に、<p>タグで段落を作るときに、勝手に一行開けてくれると考えていいかと思います。
そして、<br>は行をあけない普通の改行ということになります。

つまり、一行あけるときは
<p>あいうえお</p>
<p>かきくけこ</p>

行をあけないときは
<p>あいうえお<br />
かきくけこ</p>
となります。

*余談ながら、xhtmlでは<body>の直下に普通のテキストを書くことができませんので、文章を書くときはそれを<p>で囲ってやることが必要となります。

QExcel 2007にて最小値・最大値・平均値が計算されなくなってしまいました。

違う相談サイトにて質問させて頂きましたが、回答がなく急ぎ助けて頂きたくこちらにて質問させて頂きます。
Excel 2007使用です。E2~E25未入力セル(必要時入力)があり、折れ線グラフがうまくつながらなく「データ要素を線で結ぶ」にチェックしてもグラフの線が未入力部分も線でつながってしまう為、E2の式を「=IF(OR(C2="",D2="")=TRUE,NA(),C2-D2)」と入力し(E25~E25までオートフィル)表示された「#N/A」は条件付き書式で非表示したのですが、それまでE26で最小値として「=MIN(E2:E25)」・E27で最大値として「=MAX(E2:E25)」・E28で平均値として「=IF(COUNT(E2:E25),AVERAGE(E2:E25),)」と入力して計算され表示されていたのですが、折れ線グラフをうまく表示する為にE2~E25の式を変更したらグラフはうまく表示されたのですが、最小値・最大値・平均値が計算されなくなってしまいました。どうしてもこの3種の計算も大事で、外す事も出来ず色々調べたのですがわからなく大変困っております。助けて下さい。当方まだ未熟なのでわかりやすく教えて下さい。よろしくお願いいたします。説明が下手でわかりにかった場合お詫び致します。

違う相談サイトにて質問させて頂きましたが、回答がなく急ぎ助けて頂きたくこちらにて質問させて頂きます。
Excel 2007使用です。E2~E25未入力セル(必要時入力)があり、折れ線グラフがうまくつながらなく「データ要素を線で結ぶ」にチェックしてもグラフの線が未入力部分も線でつながってしまう為、E2の式を「=IF(OR(C2="",D2="")=TRUE,NA(),C2-D2)」と入力し(E25~E25までオートフィル)表示された「#N/A」は条件付き書式で非表示したのですが、それまでE26で最小値として「=MIN(E2:E25)」・E27で最大値とし...続きを読む

Aベストアンサー

こんにちは。

質問は、適当に改行を入れて読みやすくしてください。

=IF(OR(C2="",D2="")=TRUE,NA(),C2-D2)」
NA()がはいると、計算されません。ですから、配列数式で、エラー値を除外してあげないといけません。

=MAX(IF(ISNA(E2:E25),"",E2:E25)

=MAX(IF(ISNA(E2:E25),"",E2:E25)

=SUM(IF(ISNA(E2:E25),"",E2:E25))/COUNT(E2:E25)

これらは、配列数式ですから、一旦式を入力したら、F2を押して、『ShiftとCtrlを押しながらEnterキー』を押して、再確定してください。

Qとtopreceding-siblingを使ったグループ化

下記のxmlを

<xml xmlns:s="uuid:#dummy#" xmlns:dt="#dummy#" xmlns:rs="#dummy#" xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
<s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">
<s:AttributeType name="COUNTRY" rs:number="1" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="4" rs:fixedlength="true"/>
</s:AttributeType>
<s:AttributeType name="NAME" rs:number="2" rs:writeunknown="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="9" rs:fixedlength="true" rs:maybenull="false"/>
</s:AttributeType>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row COUNTRY="JAPAN" NAME="TARO" AGE="12"/>
<z:row COUNTRY="JAPAN" NAME="JIRO" AGE="23"/>
<z:row COUNTRY="CHINA" NAME="SABURO" AGE="34"/>
</rs:data>
</xml>

下記のxslを使用してCOUNTRY毎にグルーピングして
csv形式で出力したいですが以下のxslだとうまくいきません。

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:key name="COUNTRY" match="//z:row" use="@COUNTRY" />

<xsl:template match="/">

<xsl:for-each select="//z:row[not(@COUNTRY = preceding-sibling:://z:row/@COUNTRY)]">
<xsl:value-of select="@COUNTRY" />,<xsl:value-of select="@NAME" />,<xsl:value-of select="@AGE" />
</xsl:for-each>

</xsl:template>
</xsl:stylesheet>

[欲しい結果]
JAPAN,TARO
JAPAN,JIRO
スペース
CHINA,SABURO

下記のxmlを

<xml xmlns:s="uuid:#dummy#" xmlns:dt="#dummy#" xmlns:rs="#dummy#" xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
<s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">
<s:AttributeType name="COUNTRY" rs:number="1" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="4" rs:fixedlength="true"/>
</s:AttributeType>
<s:AttributeType name="NAME" rs:number="2" rs:writeunknown="true">
<s:dat...続きを読む

Aベストアンサー

#1>"c:\windows\system32\msxml3.dll"にしなければいけないのではないか
あんまり詳しくはないのですが、私は、IE6で動作確認しています。
IE6は、msxml3.dllは使ってなかった(別途ダウンロードしてインストールしなければいけなかったような気がします)と思います。
質問文のXSLで欲しい結果にならない理由がDLLだという意味なら、
それは、違うと思います。
select="//z:row[not(@COUNTRY = preceding-sibling:://z:row/@COUNTRY)]">
でセレクトされるのは、それまでとCOUNTRYがことなるもの
つまり
JAPAN,TARO
CHINA,SABURO
の2つのデータをセレクトすることを意味していると思われるからです。
#1>XMLのデバッグにはどのような方法があるのでしょうか?
この時のこの値という意味なら、開発環境でインスペクトすればいいと思いますが、
構文エラーが表示されるので、まずは、IEで動作させてみるのがいいと思います。
例えば、質問文のXSLであれば、
xmlns:xsl="http://www.w3.org/TR/WD-xsl"に「xsl:keyがない」
ネームスペース「z:」が定義されていないとか表示されます。
あとついでに言えば、<xsl:key>宣言は、xsl:templateの中で使われていないので必要ないと思います。

#1>"c:\windows\system32\msxml3.dll"にしなければいけないのではないか
あんまり詳しくはないのですが、私は、IE6で動作確認しています。
IE6は、msxml3.dllは使ってなかった(別途ダウンロードしてインストールしなければいけなかったような気がします)と思います。
質問文のXSLで欲しい結果にならない理由がDLLだという意味なら、
それは、違うと思います。
select="//z:row[not(@COUNTRY = preceding-sibling:://z:row/@COUNTRY)]">
でセレクトされるのは、それまでとCOUNTRYがことなるもの...続きを読む

Q等間隔ごとのセルの平均値、最大値、最小値を求める関数式

仕事で作業時間をエクセル表にまとめています。

A~Cに作業項番と作業内容、D,E,Fにそれぞれ作業時間の平均、最小、最大値が入っています。その次の列からそれぞれの作業時間が入っています。
ひとつの作業で4列分使い、左から作業開始時間、作業終了時間、所要時間、所要時間の小計と続いています。

今までは、平均、最小、最大をAVERAGE,MIN,MAX関数を使い、一つのセルずつ計算していました(例:=MIN(I9,M9,Q9,U9.Y9,AC9,・・・,)が、作業回数が30回を超えたところ、これらの方法が使えなくなってしまいました。(計算できる数値が30個までしかない)

30個以上の数値を計算させるためにはどうしたらよいのでしょうか。
また、式が長くなると管理が大変になってくるので、すっきりとまとめられるような関数があったら教えてください。

以上です。よろしくお願いします。

Aベストアンサー

配列数式を使います。
=MAX(IF(MOD((COLUMN($I$9:$AP$9)-9),4)=0,$I$9:$AP$9,""))
CtrlキーとShiftキーを押しながら、Enterキーを押します。
数式には、自動的に { }  がついて、
{=MAX(IF(MOD((COLUMN($I$9:$AP$9)-9),4)=0,$I$9:$AP$9,""))}
のようになります。

例:=MIN(I9,M9,Q9,U9.Y9,AC9,・・・
の場合、列番号が I が9番目、Mが13番目・・・と4つ置きになっていますので、
範囲のなかで、列番号から9を引いた数を4で割った余りが0のものを計算するという意味です。AVERAGE,MAX関数も同じです。

例の通りでなかったら、適切に変えてください。
等間隔でしたら、なんらかの規則性があると思います。

Qスタイルシートのfor-each select=に変数を使用したい

お世話になります。

<xsl:param name="A" select="1000">



<xsl:template name="B">



<xsl:for-each select=".//1000"> -(1)
</xsl:template>

<xsl:template match="1000"> -(2)
</xsl:template>

(1)
(1)の箇所の「1000」を上で宣言したAを使用したく、
<xsl:for-each select="concat('.//',$A")> 
など色々試したのですが、うまくいきませんでした。
(2)
(2)の箇所を「A」の変数に色々な形で置き換えてもうまくいきませんでした。

上記2点、を変数を使用して指定したいのですが、どのようにすれば実現できますでしょうか?

大変お手数とは思いますがよろしくお願いします。

Aベストアンサー

<xsl:for-each select=".//1000"> -(1)
これでは,変数にする以前の問題として,まともに動かないのでは?
要素名の一文字目は数字にはできません。xpathも大丈夫でしょうか?
まず,変数にする前にきちんと動くようにしたとして,次に変数にするには,環境によって難易度が異なります。

xalanのようにdyn:evaluate()が使えるものは,要素名を変数に文字列として入れて,これをevaluate関数でノードセットに戻します。
概念的には,
 <xsl:variable name="hensu" select="'s1000'"/>
として,要素名を''で囲んで,文字列としてhensuに格納します。
これを使うときは,
 <xsl:for-each select="dyn:evaluate($hensu)">
などとしますが,evaluateの引数は,パーサによって異なります。

なお,msxmlは,そのまんまではevaluateを使えません。

次に,<xsl:template match="1000"> -(2)ですが,これを変数化するのは不可能だと思います。
match内のxpath表現をランタイムで変更できる仕様はないと思います(多分)。

variableもparamも,xsltの変数は,通常のプログラム言語の変数と異なり,とても制限が多く,使いづらいものなのです。

<xsl:for-each select=".//1000"> -(1)
これでは,変数にする以前の問題として,まともに動かないのでは?
要素名の一文字目は数字にはできません。xpathも大丈夫でしょうか?
まず,変数にする前にきちんと動くようにしたとして,次に変数にするには,環境によって難易度が異なります。

xalanのようにdyn:evaluate()が使えるものは,要素名を変数に文字列として入れて,これをevaluate関数でノードセットに戻します。
概念的には,
 <xsl:variable name="hensu" select="'s1000'"/>
として,要素名を''...続きを読む

Qc言語 正負の値それぞれでの最大値最小値

大学の研究で使うデータ処理で困っています。
Microsoft Visual C++ 2008 Express Editionを使っています。

例えば、10個の値が縦一列に入ったtxtファイルがいくつかあったとして
-5,-3,-2,0,3,4,5,6,7,8,
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大は8、最小は3)
マイナス側の最大値・最小値をそれぞれ求め(この場合、最大は-2、最小は-5)
結果として表示される

0,1,2,3,4,5,6,7,8,9,
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大は9、最小は1)
マイナス側の最大値・最小値をそれぞれ求め(この場合、最大はありません、最小はありません)
結果として表示される

0,0,0,0,0,0,0,0,0,0
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大はありません、最小はありません)
マイナス側の最大値・最小値をそれぞれ求め(この場合、最大はありません、最小はありません)
結果として表示される


といったプログラムを作成したいです。教えてください!

大学の研究で使うデータ処理で困っています。
Microsoft Visual C++ 2008 Express Editionを使っています。

例えば、10個の値が縦一列に入ったtxtファイルがいくつかあったとして
-5,-3,-2,0,3,4,5,6,7,8,
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大は8、最小は3)
マイナス側の最大値・最小値をそれぞれ求め(この場合、最大は-2、最小は-5)
結果として表示される

0,1,2,3,4,5,6,7,8,9,
だった場合には
プラス側の最大値・最小値をそれぞれ求め(この場合、最大は9、最小は1)...続きを読む

Aベストアンサー

本当に研究で使うデータ処理なのかなぁ?
こんな単純なデータ処理をして結果を表示するだけなんて研究に使うとは思えない。
むしろ課題を丸投げにしているように見える。

数値が縦一列に入っているということは各数値は改行で区切られているのだから、
ファイルをオープンして一行づつデータを読み取りながら、その数値の正負零を判定し、
(零を除いて)正負それぞれの最大最小を順次残していくようにすればよい。
最後に、残った最大最小の値を表示または非存在を表示する。
大した処理ではないと思われますが。。。

もしC言語が苦手だというのであれば、Excelなどの表計算ソフトのマクロで行っても
たいしたことは無いでしょう。

Qxsl:variableについて

お世話になります。xsl:variableについて質問です。

xsl:elementのnameを動的に指定したく、次のようにしました。
FireFox3 Beta 5にて、innerHTMLをtextareaに貼り付けて確認しました。

xml
<testNode>aaa</testNode>

xsl
<xsl:variable name="el"><xsl:value-of select="name(.)"/></xsl:variable>
<xsl:element name="$el">aiueo</xsl:element>

こうすると、
aiueo
のみ出力されました。希望する出力は
<testNode>aiueo<testNode>
です。

xsl:variableの使い方が間違っているのでしょうか?先程からずっとこれに悩んでいます。。。
よろしくお願いします。

Aベストアンサー

============hoge.xml==============
<testNode>aaa</testNode>
=====================fuga.xsl==============
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match ="/">
<p>
s<xsl:value-of select="name(.)" />s <!-- name(.)は何もありません。match="/testNodeとかなら値は出てくるだろうけど。"-->
<xsl:apply-templates />
</p>
</xsl:template>
<xsl:template match="testNode">
<xsl:variable name="el"><xsl:value-of select="name(.)"/></xsl:variable>

<!--
7.6.2 Attribute Value Templates
In an attribute value that is interpreted as an attribute value template,
such as an attribute of a literal result element, an expression can be
used 【by surrounding the expression with curly braces ({}). 】
{}で括らないでテストしたら$は要素名に使えないって怒られた。
-->
<xsl:element name="{$el}">aiueo</xsl:element>
</xsl:template>
</xsl:stylesheet>

=============
出力結果
<?xml version="1.0" encoding="utf-8"?>
<p>
ss <testNode>aiueo</testNode>
</p>

============hoge.xml==============
<testNode>aaa</testNode>
=====================fuga.xsl==============
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match ="/">
<p>
s<xsl:value-of select="name(.)" />s <!-- name(.)は何もありません。match="/testNodeとかなら値は出てくるだろうけど。"-->
<xsl:apply-templates />
</p>
</xsl:template>
<xsl:template match="testNode">
<xsl:variable name="el"><xsl:value-of select="name(.)"/>...続きを読む


人気Q&Aランキング

おすすめ情報