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
No.8ベストアンサー
- 回答日時:
No7の方法は表記的には合っているけれど正しくないよ。
理由は item が複数有った場合正しい node を参照できていない可能性が有るから。
>で、どうやって解決したらよいのでしょうか??
見えないと判ったんだから見える所から持ってくるか、見える所から投げるか、って形に書き換えるしかないよ。
つまり
A. match="item" の段階を作ってそこで生成する形に変更するか
B. 現状の形で keyword で投げる時に title も渡すか
C. rootで全部処理しちゃうか
のどれか。
Bで要りそうなもの
http://www.infoteria.com/jp/contents/xml-data/RE …
http://www.google.co.jp/search?q=xslt%20with-par …
Cで要りそうなもの
http://www.infoteria.com/jp/contents/xml-data/RE …
因みに「つまりどういうソース?」と聞かれてもそれは丸投げになっちゃうから答えてあげられない。
No.9
- 回答日時:
またまた挑戦です。
・ 複数のitemとkeywordsに対処したつもりです。
--------------------------------------------------------------------
<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<list>
<xsl:apply-templates select="books"/>
</list>
</xsl:template>
<xsl:template match="books">
<xsl:for-each select="item">
<xsl:for-each select="keywords">
<xsl:apply-templates select="."/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<xsl:template match="keywords">
<xsl:for-each select="keyword">
<category>
<xsl:value-of select="."/>
<title>
<xsl:value-of select="../../title"/>
</title>
</category>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
No.7
- 回答日時:
XSLを書き直してみました。
------------------------------------------------------
<?xml version="1.0" encoding="utf-16"?>
<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"/>
</list>
</xsl:template>
<xsl:template match="keywords">
<xsl:for-each select="keyword">
<category>
<xsl:value-of select="."/>
<title>
<xsl:value-of select="/books/item/title"/>
</title>
</category>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
------------------------------------------------------
No.5
- 回答日時:
><xsl:template match="title">
>が実行されないかわからないのです。
><xsl:apply-templates select="books/item/title"/>
>がCの関数に飛ばす文と同じように思っており、
Cなら判るんだね。
なら
----------------------------------
- <item no="1">
<title>プログラムの基礎</title>
<creator>Heinemeier Hansson</creator>
<publisher>オーム社</publisher>
- <keywords>
<keyword>プログラミング</keyword>
<keyword>ソフトウェア</keyword>
<keyword>入門</keyword>
</keywords>
</item>
----------------------------------
多分この親として<book>で囲ってあってitemが複数あるんだと思う。
これをちょっとCっぽい形にしてみようか
item[0]
{
no = 1;
title = { "プログラムの基礎" };
creator = { "Heinemeier Hansson" };
publisher = { "オーム社" };
keywords =
{
keyword[0] = "プログラミング";
keyword[1] = "ソフトウェア";
keyword[2] = "入門";
};
},
item[1]
{
//...
};
若干違うんだけどこんな感じだと思ってくれたら大丈夫。
そんで xsl:template は
呼ばれて実行するのと適合で実行するのと2系統の実行の仕方が有って
今回のは後者の方法。
イベントを投げるとそのイベントが受け取れる関数が呼ばれるよね?
適合系の場合はこれに似ていて受け取れる「nodeName」であった場合に実行される。(matchの部分)
だとして
><xsl:template match="/">
有無を言わさずroot処理なのは判ると思う。
実際ここは必ず適合して実行される。
><xsl:template match="keyword">
これは投げた物、 nodeName が keyword なら実行される。
><xsl:template match="title">
同じく「投げた物が」 title なら実行される。
(正しくは投げた中にtitleが有ればそこを起点に実行される)
match="/" でのカレント
node = {root : {"book" : {"item","item",...} } , ...};
そこの中で投げてる場所
><xsl:apply-templates select="books/item/keywords/keyword"/>
これを受けて match="keyword" が適合。そこでのカレント
node = { "keyword":"プログラミング" },{ "keyword":"ソフトウェア"},...;
(複数個のkeywordを投げられているのでその時によって keyword="プログラミング"→keyword="ソフトウェア" と値が変わる)
そこの中で投げてるのは
><xsl:apply-templates select="books/item/title"/>
今有るのは・・・
node = { "keyword":"プログラミング" },{ "keyword":"ソフトウェア"},...;
投げる物が無い、の意味、判りそう?
まさかとは思っていましたが、
やはり下っ端は上位にはいけないんですね…
すごく使え勝手が悪いですね><
で、どうやって解決したらよいのでしょうか??
No.4
- 回答日時:
>違うんでしょうか?
合ってるよ。
カレントは keyword なんだけど
><xsl:apply-templates select="books/item/title"/>
→そんなものは無い が答え。
それは分かっているのですが、
なぜ
<xsl:template match="title">
<title>
<xsl:value-of select="."/>
</title>
</xsl:template>
が実行されないかわからないのです。
どうも
<xsl:apply-templates select="books/item/title"/>
がCの関数に飛ばす文と同じように思っており、
<xsl:template match="title">
がその関数だという考えがあるんですが、
XMLはどういう風になっているのか分からなくて
No.3
- 回答日時:
「生成されるXMLは」が明示されていないようです。
一応、次のように仮定して試してみたいと思います。
・ xslに "books/item/keywords/keyword" とあるので、xmlにも文書要素として、booksを加えます。
--------------------------------------------------------------------------------
<books>
<item no="1">
<title>プログラムの基礎</title>
<creator>Heinemeier Hansson</creator>
<publisher>オーム社</publisher>
<keywords>
<keyword>プログラミング</keyword>
<keyword>ソフトウェア</keyword>
<keyword>入門</keyword>
</keywords>
</item>
</books>
--------------------------------------------------------------------------------
・ <category>はどこに表示したらよいかわからないので無視します。
・ <keyword>は最初のものだけと、全ての場合と、二つを取り上げます。
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<title>
<xsl:value-of select="books/item/title"/>
</title>
<list>
<xsl:value-of select="books/item/keywords/keyword"/>
</list>
</xsl:template>
</xsl:stylesheet>
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<title>
<xsl:value-of select="books/item/title"/>
</title>
<xsl:apply-templates select="books/item/keywords"/>
</xsl:template>
<xsl:template match="keywords">
<xsl:for-each select="keyword">
<list>
<xsl:value-of select="."/>
</list>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
--------------------------------------------------------------------------------
・ xslがツリーを辿っていく時、適用されるテンプレートを探しながらルートノードから順に下へと始めます。
・ 一度使われたテンプレートのノードの子孫は除かれていくと思います。
すいません。
生成したいXMLが明白でなかったですね。
生成したいXMLは
<list>
<category>
プログラミング
<title>
プログラミングの基礎
</title>
</category>
<category>
ソフトウェア
<title>
プログラミングの基礎
</title>
</category>
<category>
入門
<title>
プログラミングの基礎
</title>
</category>
</list>
としたかったんです。
No.2
- 回答日時:
><xsl:apply-templates select="books/item/title"/>←ここ
ここでmatchしているのは
><xsl:template match="keyword">
>>>XMLは
中略
>>>- <keywords>
>>><keyword>プログラミング</keyword>
さて逆に質問になっちゃうんだけど
template match="keyword"
ここで保持されているカレントノードの中身、どうなってるか判るかな?
それが判るとなぜ投げられないのかが判るよ。
もし中身を補足してみるつもりなら
「判らない」じゃなく「こうかな?」で。
No.1
- 回答日時:
>となり、<title>が入りません。
><xsl:apply-templates select="books/item/keywords/keyword"/>
rootのmatchにはこれしかapplyが無いね。
titleを投げてる部分が無いんだけど・・・?
って事じゃないかな。
ご回答ありがとうございます。
titleは
<xsl:template match="keyword">
<category>
<xsl:value-of select="."/>
<xsl:apply-templates select="books/item/title"/>←ここ
</category>
</xsl:template>
のように投げているんですけど
それでもうまくいきません><
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- HTML・CSS cssが効かなくて困ってます 1 2023/01/01 23:57
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- JavaScript 中百舌鳥駅と深井駅を入れ替えて選択しても同じ挙動にしたいです。 2 2022/06/24 18:45
- その他(動画サービス) https://otologic.jp/free/se/game-fighting01.html h 2 2022/07/28 17:18
- JavaScript 1度きりではなく、繰り返し、挙動が変わるようにしていただきたいです。 1 2022/07/03 15:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XSLで、XMLの空タグを制御したい。
-
ノードの並び替え
-
タグの有無の判定
-
xslでの最小値、最大値の取得
-
xmlのテキストにリンクを張りた...
-
XMLのHTMLへの変換 (初心者)
-
CPUの考え方を教えてください ...
-
XMLで要素が記述された順番に意...
-
バッチファイルでテキストファ...
-
昔Winnyってありましたけど、あ...
-
あせんうぶり言語
-
VB6でXMLを作成しているのです...
-
SNMP リンクダウンとノードダ...
-
あるノードリストに、特定の名...
-
HTTPステータス 404 - There is...
-
コンテキストメニュークリック...
-
Listからのnull要素を削除方法は?
-
ルート要素ノードが2個ある場合?
-
ノードとは
-
このエラー、何とかなりません...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XSLで、XMLの空タグを制御したい。
-
タグの有無の判定
-
XSLでXMLデータをタブ区切りデ...
-
XSLTで固定長データファイルを...
-
XSL中の改行、タブを無効にした...
-
xmlのテキストにリンクを張りた...
-
重複するものを消したい
-
XSLTがブラウザで表示されません。
-
うまく表示されない
-
文字列の取得
-
xsl:param要素をxsl:templateの...
-
value-ofの値を属性値とするには
-
XMLをXSLを使いHTMLに変換した...
-
XMLから指定テキストのみを抜き...
-
ある文字列を含むノードが存在...
-
VBAからxml・スタイルシートを...
-
xsl、xpath式の書き方について
-
XSLで特定のタグだけを出力する...
-
XSL内でJavaScriptを記述し、Ja...
-
XSLTで直下のテキストのみ取得...
おすすめ情報