• ベストアンサー
  • すぐに回答を!

XSLTのselectの指定

以下のようなXMLファイルを作成した(XML宣言省略) <purchase-order> <book> <title>古い算数</title> <!--注文する本の題名--> <price>1500</price> <!--一冊あたりの本の値段--> <count>6</count> <!--注文した冊数--> </book> <book> <title>楽しくない国語</title> <price>1000</price> <count>4</count> </book> <book> <title>詳解リカバリ</title> <price>4000</price> <count>5</count> </book> </purchase-order> データ中の本のタイトルは気にしないでください(^^;;; この注文全体について一冊あたりの平均価格(つまり(1500*6+1000*4+4000*5)/(6+4+5))を求めたいのですが、 どうやって求めたらいいのでしょうか? 6+4+5の部分だけなら 前略 <xsl:template match="purchase-order"> <xsl:value-of select="sum(count)"> <xsl:template> 後略 でうまくいくんですが(別なデータでは上手くいった。関数名との競合は起きないと思うんですが..) 分子を出すにあたって、selectに指定する内容が解らないんです。

noname#20378

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数98
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1
  • dellko
  • ベストアンサー率100% (1/1)

初書き込みです。 時間がったているので解決したかと思いますが、レスしますね。 以下のテンプレートを使用すれば、出来るのかなと思います。 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="purchase-order" /> </body> </html> </xsl:template> <xsl:template match="purchase-order"> <xsl:variable name="total_sum"> <xsl:call-template name="culc_sum"> <xsl:with-param name="tanka" select="book/price" /> <xsl:with-param name="suryou" select="book/count" /> </xsl:call-template> </xsl:variable> <xsl:text>合 計</xsl:text> <xsl:value-of select="format-number( $total_sum div sum(book/count),'#,###')" /> </xsl:template> <xsl:template name="culc_sum"> <xsl:param name="tanka" /> <xsl:param name="suryou" /> <xsl:choose> <xsl:when test="not($tanka) or not($suryou)"> <xsl:value-of select="0" /> </xsl:when> <xsl:otherwise> <xsl:variable name="sum_data"> <xsl:call-template name="culc_sum"> <xsl:with-param name="tanka" select="$tanka[position()>1]" /> <xsl:with-param name="suryou" select="$suryou[position()>1]" /> </xsl:call-template> </xsl:variable> <xsl:value-of select="number($tanka[1]) * number($suryou[1]) + $sum_data" /> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>

共感・感謝の気持ちを伝えよう!

質問者からのお礼

実は解決しておりませんでした(汗) ご回答ありがとうございます。 (僕が未熟なだけかもしれないけど)ソース見てこんな書き方もあるんだなぁと感心しました

関連するQ&A

  • XSLTの処理について

    いつもお世話になっております。 XMLの動作についての質問です。以下のようなXMLファイルがあったとします。それに対して、その下のようなXSLファイルがあり、変換させると、結果XMLができます。 そこでわからないのは、test.xslの中ほどで、<xsl:template match="book/title/price">という風にXPath式でbook/title/priceと指定しているのに、結果には<title>の値も出力されます。なぜでしょうか。 自分のイメージとしては、<title>の値は出力されず<price>の値だけが出力されるのじゃないのかなっていう感じです。さらに<newTag>に<title>の値が挟まれていないのもなぜなのかわかりません。 お分かりになる方よろしくお願いします。もし参考文献に良いサイトや本がありましたらそちらも紹介をお願いします。 <<<test.xml>>> <?xml version="1.0" encoding="Shift_JIS"?> <books>  <book>   <title>    XMLとは    <price>2000</price>   </title>  </book>  <book>   <title>    XML概論    <price>1800</price>   </title>  </book>  <book>   <title>    XMLマスター    <price>4000</price>   </title>  </book> </books> <<<test.xsl>>> <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/">  <answer>   <xsl:apply-templates select="books/book"/>  </answer> </xsl:template> <xsl:template match="book/title/price">  <newTag>   <xsl:value-of select="."/>  </newTag> </xsl:template> </xsl:stylesheet> <<<結果.xml>>> <?xml version="1.0" encoding="utf-8" ?> <answer> XMLとは <newTag>2000</newTag> XML概論 <newTag>1800</newTag> XMLマスター <newTag>4000</newTag> </answer>

    • ベストアンサー
    • XML
  • XSLT

    いつもお世話になっております。 次のXSLTの結果がどうしてそうなるのかわからないので教えてください。 解説には、「処理は必ずルートノードのテンプレートから始まります」と書いてあるんですが、できましたら、その辺もからめて、どういう処理の流れになるのか、カレントノードがどう移動していくのか、教えていただけると助かります。 (XML) <?xml version="1.0" encoding="Shift_JIS"?> <Conference Situation="Reserved" Equipment="Projector">  <Room>会議室</Room>  <User>山田太郎   <Date>2008/05/08</Date>   <Time>10:00-12:00</Time>  </User>  <Number>4名</Number> </Conference> (XSLT) <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  <xsl:output method="text" />  <xsl:template match="/Conference">   <xsl:value-of select="Number" />  </xsl:template>  <xsl:template match="Conference/User">   <xsl:value-of select="Date" />  </xsl:template>  <xsl:template match="/">   <xsl:value-of select="Conference/Room" />  </xsl:template> </xsl:stylesheet> (結果) 会議室

    • ベストアンサー
    • XML
  • XSLT変換について

    以下のようにファイルを作成してみました。 ローカルではIEに表示できるのですが,アップすると表示されず「スタイルシートにドキュメント要素が含まれていません。スタイルシートが空であるか、正しく構成された XMLドキュメントでない可能性があります。」というコメントが出ます。ご存知の方いらっしゃいましたらどうか教えてください。 ↓作成したファイル 「top.xml」(省略) 「top.xsl」 <?xml version="1.0" encoding="Shift_JIS" ?> <xsl:stylesheet xmlns:xsl="(省略)" version="1.0"> <xsl:import href="./note.xsl" /> <xsl:output method="html" encoding="Shift_JIS" /> <xsl:template match="/">  <html xmlns="(省略)" xml:lang="ja" lang="ja">  <head>   <meta http-equiv="Content-Type"    content="text/html; charset=Shift_JIS" />   <title><xsl:value-of   select="/top/title" /></title>  </head>  <body>   <xsl:call-template name="header" />   <div align="center"><h1>HOME PAGE</h1></div>   <table> <tr><th>CONTENTS</th></tr> <xsl:for-each select="/top/contents"> <tr><th><a href="{url}"><xsl:value-of      select="label" /></a></th>      <td><small><xsl:value-of      select="text" /></small></td></tr> </xsl:for-each>   </table><br />   <xsl:call-template name="footer" />  </body>  </html> </xsl:template> </xsl:stylesheet> 「note.xsl」(top.xslにおけるxsl:importをコメントアウトしても結果は変わらなかったため,記載省略。)

    • 締切済み
    • XML

その他の回答 (1)

  • 回答No.2
  • dellko
  • ベストアンサー率100% (1/1)

訂正です。 <xsl:text>合 計</xsl:text> ではなくて、 <xsl:text>平均価格</xsl:text> ですね。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • XSLTの動作

    いつもお世話になります。 以下のXSLTの処理の動き方を教えてください。 どうして3の結果xmlになるのかわかりません。おそらくposition()の取り方がわかっていないのかなって思っています。 自分としては <answer>  <色>白</色>  <色>yellow</色>  <色>赤</色>  <色>blue</色>  <色>黒</色> </answer> になるんじゃないのかなって思ってしまうのですが・・・。 (1)データ <?xml version="1.0" encoding="Shift_JIS"?> <color_pencil>  <price>1300</price>  <color><en>white</en><jp>白</jp>  <color><en>yellow</en><jp>黄色</jp>  <color><en>red</en><jp>赤</jp>  <color><en>blue</en><jp>青</jp>  <color><en>black</en><jp>黒</jp> </color_pencil> (2)XSLT <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/">  <answer>   <for-each select="color_pencil/color">    <xsl:choose>     <xsl:when test="position() mod 2=0">      <xsl:apply-templates select="." />     </xsl:when>     <xsl:otherwise>      <xsl:call-template name="color" />     </xsl:otherwise>    </xsl:choose>   </xsl:for-each>  </answer> </xsl:template>  <xsl:template match="color">   <色><xsl:value-of select="jp" /></色>  </xsl:template>  <xsl:template name="color">   <色><xsl:value-of select="en" /></色>  <xsl:template> </xsl:stylesheet> (3)結果xml <answer>  <色>white</色>  <色>黄色</色>  <色>red</色>  <色>青</色>  <色>black</色> </answer>

    • ベストアンサー
    • XML
  • XMLの実体参照とXSLT

    次のようなXMLファイルをXSLTで処理したいのですが、&baseの部分がうまく表示できません。 どのようにしたら表示できるでしょうか? ■a.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="a.xsl"?> <!DOCTYPE test [ <!ELEMENT name (#PCDATA)> <!ENTITY base SYSTEM "base.xml"> ]> <test> <name>abc</name> &base; </test> ■base.xml <?xml version="1.0" encoding="UTF-8"?> <base>base</base> ■a.xsl <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="UTF-8" /> <xsl:template match="/"> <xsl:apply-templates select="test" /> <xsl:apply-templates select="base" /> </xsl:template> <xsl:template match="test"> name:<xsl:value-of select="name" /> </xsl:template> <xsl:template match="base"> base:<xsl:value-of select="base" /> </xsl:template> </xsl:stylesheet> □結果 name:abc ※base.xmlの内容を表示できない

    • ベストアンサー
    • XML
  • XSLTについて

    入力となるXMLの要素Aに属性が複数存在した場合に、ある属性以外のすべての属性を要素Bに付与して出力したいのですがどのようなXSLTで記述すればいいのでしょうか? 入力例) <sample> <要素 aa="1" bb="2" cc="3">AAAAAAA</要素> </sample> 出力例) <sample> <youso bb="2">AAAAA</youso> </sample> XSLT) <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/ 1999/XSL/Transform" version="1.0"> <xsl:template match="/">   <sample> <xsl:apply-templates/> </sample> </xsl:template> <xsl:template match="要素"> <xsl:copy> <!-- <xsl:copy-of select="@*"/> -->☆ </xsl:copy> </xsl:template> </xsl:stylesheet>

    • 締切済み
    • XML
  • XSLTがブラウザで表示されません。

    勉強のために、下記のサンプルXMLファイル、XSLファイルを作成し、ブラウザで表示させようと思ったのですが、表示されません。 表示させる為になにか必要なソフト等をインストールしないといけないのでしょうか? ちなみにブラウザはIE5.5を使用しています。 もし、何か分かる方がいらっしゃいましたら、ご教授御願い致します。 ※sample.xml <?xml version="1.0" encoding="Shift_JIS"?> <?xml-stylesheet type="text/xsl" href="sample.xsl"?> <PAGE> <EMPLOYEES> <EMPLOYEE> <EMPNO>1</EMPNO> <ENAME>一郎</ENAME> <JOB>President</JOB> <HIREDATE>1990-04-01</HIREDATE> <SAL>10000</SAL> <DEPTNO>10</DEPTNO> </EMPLOYEE> <EMPLOYEE> <EMPNO>50</EMPNO> <ENAME>次郎</ENAME> <JOB>Director</JOB> <MGR>1</MGR> <HIREDATE>1991-04-01</HIREDATE> <SAL>6000</SAL> <DEPTNO>30</DEPTNO> </EMPLOYEE> </EMPLOYEES> </PAGE> ※sample.xsl <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/ 1999/XSL/Transform" version="1.0"> <xsl:output method="html" encoding="Shift_JIS"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="PAGE"> <HTML> <BODY> <xsl:apply-templates/> </BODY> </HTML> </xsl:template> <xsl:template match="EMPLOYEES"> <xsl:apply-templates/> </xsl:template> <xsl:template match="EMPLOYEE"> <xsl:value-of select="ENAME"/><BR/> </xsl:template> </xsl:stylesheet>

    • ベストアンサー
    • XML
  • 簡単なことだと思うんですが・・・

    XML初心者のものです。 要素の中に要素を生成するXSLを作ったのですが、 生成されません。 XMLは - <item no="1"> <title>プログラムの基礎</title> <creator>Heinemeier Hansson</creator> <publisher>オーム社</publisher> - <keywords> <keyword>プログラミング</keyword> <keyword>ソフトウェア</keyword> <keyword>入門</keyword> </keywords> </item> となっており、 XSLは <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <list> <xsl:apply-templates select="books/item/keywords/keyword"/> </list> </xsl:template> <xsl:template match="keyword"> <category> <xsl:value-of select="."/> <xsl:apply-templates select="books/item/title"/> </category> </xsl:template> <xsl:template match="title"> <title> <xsl:value-of select="."/> </title> </xsl:template> </xsl:stylesheet> としています。 生成されるXMLは、 <list> <category>プログラムの基礎</category> </list> となり、<title>が入りません。 解決策を教えてくださいm(_ _)m

    • ベストアンサー
    • XML
  • XSLTの記述方法

    お世話になります。 XML+XSLTで開発しております。 XSLTの記述方法でjavascriptの引数にXMLデータを挿入する記述は どうすればよいのでしょうか? すごい初歩的な質問かもしれませんが ご教授よろしくお願いいたします。 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <table> <tr> <td > <a href="#" onClick="hogehoge('pram')">hogehoge rink </a> </td> </tr> </table> </xsl:template> </xsl:stylesheet> ↓↓↓↓↓↓こんな感じにしたい↓↓↓↓↓↓ <a href="#" onClick="hogehoge('<xsl:value-of select="$prm_test"/>')">りんく</a>

    • ベストアンサー
    • XML
  • Firefox・GoogleChromeでのxslt読み込み

    Firefox・GoogleChromeでのxslt読み込み 現在、xml + xsltでhtmlを生成する試験をしているのですが、 Firefox・GoogleChromeで意図通りの結果にならず悩んでおります。 ソースは下記の通りなのですが、何かアドバイスをいただけたら助かります。 test.xmlとtest.xslを下記のようなフォルダ構成で配置する。 【フォルダ構成】 project |-xml | |-test.xml |-xsl |-test.xsl 【ソース】 test.xml <?xml version = "1.0" encoding = "utf-8"?> <?xml-stylesheet type = "text/xsl" href = "../xsl/test.xsl"?> <tests name = "test"> <test> <tag>aaa</tag> </test> <test> <tag>bbb</tag> </test> <test> <tag>ccc</tag> </test> </tests> test.xsl <?xml version = "1.0" encoding = "utf-8" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method = "html" encoding = "utf-8" doctype-system = "string" media-type = "text/xml" /> <xsl:template match="/"> <html lang = "ja-JP"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <title><xsl:value-of select = "tests/@name" /></title> </head> <body> <xsl:apply-templates /> </body> </html> </xsl:template> <xsl:template match = "test"> <div> <xsl:value-of select = "tag" /> </div> </xsl:template> </xsl:stylesheet> 【結果】 ・IE・Safari・Opera -> ちゃんと表示してくれる ・Firefox(Ver3.5.3) -> NG   ->・ページタイトル反映されない    ・tagの中身("aaa"・"bbb"・"ccc")が一行に表示されてしまう ・Google Chrome(Ver5.0.342.8 beta) -> NG   ->・何も表示されず、画面真っ白    ・デベロッパーツールでは、"Unsafe attempt to load URL・・・"とエラーが出ている 【備考】 ・『Mozilla で扱えるMIMEタイプは、IEより厳密』みたいな記述を見つけたので、 test.xslの3行目に呪文みたいなのを見よう見真似で書いてみたのですが、 効果なし。というか、この記述があってるのかも分からない。。。 ・Firefoxの場合、同じフォルダにtest.xmlとtest.xslを配置すると ちゃんと表示してくれる。 長々となってしまいましたが、よろしくお願いします。

    • 締切済み
    • XML
  • xsltを利用して変換後改行が入る

    MSXMLを利用して、XMLをHTMLへ変換しているのですが、変換後、改行が入ってしまいます。 どうすれば改行を取ることができるでしょうか? 【xslt】 <xsl:template match="ruby"><xsl:copy-of select="self::node()" /></xsl:template> 【XML】 <ruby><rb>○</rb><rp>〔</rp><rt>××</rt><rp>〕</rp></ruby> 【結果(HTML)】 <ruby xmlns=""> <rb>○</rb> <rp>〔</rp> <rt>××</rt> <rp>〕</rp>

    • 締切済み
    • XML
  • XSLTでの複数のXML検索結果を統合するには?

    初歩的な質問でごめんなさい。 XSLTを使って複数のXMLを検索した結果を、表示したいのですが、結果を1つのテーブルに統合するにはどうすればいいのでしょう。 次のスクリプトを基に作りたいのですが。 function search (keyword) { node = thexsl.XMLDocument.selectSingleNode("//xsl:for-each"); if(keyword) node.setAttribute("select", "//data[contains(word, '" + keyword + "')]"); else node.setAttribute("select", "//data"); str = thexml.XMLDocument.transformNode(thexsl.XMLDocument); view1.innerHTML = str; } 次のファイルを利用して検索したいです、 <xml id="thexml1" src="db1.xml"></xml> <xml id="thexml2" src="db2.xml"></xml> <xml id="thexml3" src="db3.xml"></xml> <xml id="thexsl" src="db.xsl"></xml> xmlファイルの内容 <?xml version="1.0" encoding="utf-8" ?> <dataroot xml:lang="ja"> <data>・・・</data>  ・・・ </dataroot> xslファイルの内容 <?xml version="1.0" encoding="utf-8" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <table> <tr>・・・</tr> <xsl:for-each select="//data"> <tr>・・・</tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet> よろしくお願いします。

    • 締切済み
    • XML
  • テキストノードの文字列に一致した要素の取得(xPath

    xml,xslを勉強しているのですが、xPathの指定が上手く定義できない状態です。ご教授の程お願い致します。 下記がxml,xslです <!-- アーティスト名とタイトルを明記したxml --> -- music.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="music.xsl"?> <music> <artist> Ciel <title>wake</title> </artist> <artist> Flew <title>BANG</title> </artist> <artist> cobu                 // (1) <title>calling</title> </artist> <artist> cobukure <title>dammy</title> </artist> </music> <!-- 条件に一致したアーティスト名、タイトルを表示するxsl --> -- music.xsl <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head><title></title></head> <body> <xsl:for-each select = "descendant::artist[contains(text(),'cobu')]"> // (2) <xsl:value-of select ="text()" />: <xsl:value-of select ="title" /><br/> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet> //上記の処理結果 cobu :calling cobukure :dammy //希望する処理結果 cobu :calling ・質問内容 XMLのartistのテキストノード=cobuをxsl:for-eachでselectして、 titleのcallingを表示したい 本、サイトなどで調べて、 descendant::artist[contains(text(),'cobu')]のxPathまでは、 導けたのですが、この場合は、cobuを含むので、 artistのテキストノード=cobukureもselectされdummyが表示されてしまいます。 処理結果、 cobu :callingのみselectできるxPathの定義をご教授の程お願い致します

    • ベストアンサー
    • XML