XSL/XSLT
XSLTXTって使ってる人いますか?
ttps://xsltxt.dev.java.net/
ttp://www.zanthan.com/ajm/xsltxt/index.html
とりあえず < とか書かなくていいのがいい。 >>279
> とりあえず < とか書かなくていいのがいい。
まともな XML オーサリングツール使えよ。 <li a="2300" b="hoge"/>
<li a="jiro" b="もっこり"/>
<li a="義雄" b="boke"/>
といったようなリストがあったとして、
属性b の値が hoge の時だけ 属性a の値を取りたいんですけど、
xpathではどうすればいいのでしょうか? >>282
li[@b='hoge']/@a
かな。 <a>
<b>bbb</b>
<c>ccc</c>
</a>
こんな感じのものを、「<b>要素が存在すればattributeにbを書き、<b>要素が存在しないまたは<b>要素の中身が空の場合はattributeにcを書く」というふうにしたいのですが、
<xsl:attribute name="foo">
<xsl:choose>
<xsl:when test="条件">
<xsl:value-of select="b" />
<xsl:/when>
<xsl:otherwise>
<xsl:value-of select="c" />
<xsl:/otherwise>
</xsl:choose>
</xsl:attribute>
whenの条件にどのように書けばいいのでしょうか?そもそもchooseは間違っているのでしょうか? >>284
test="b and not(b='')"
単に "not(b='')" だけでいいかも。 >>285
> test="b and not(b='')"
うまくいきました!感謝!! 1ページの表示件数を10とかに指定して、
続きは<a>で次のページを表示させる…ってことは、
xsltでできるんでしょうか?
それともほかのプログラムと組み合わせたほうが賢明なんでしょうか? サーバーサイドでやればできる。実際動かしてみたことある。
しかし素直にDOMとか使った方がいいかと。 >>288
DOMっすかあ・・・。
最近XMLに興味を持ち始めて、あとPHPも気になりだしたような、
プログラミングなんてまったくできない人間なので。
これから勉強していきたいと思います。ありがとう。
PHP を使おうとは思うんだが、サーバーで動的生成か、ローカルで静的生成かで迷ってる。
ブログ程度なら静的にすべきなのかな。でも、動的だとコンテントネゴシエーションとかブラウザ振り分けなどの恩恵が……うーむ。 blog≠xml blog∩xml=Φ
blog≠xslt blog∩xslt=Φ
だと思うけど、違うのかな >>292
Φ (ファイ) が何を意味するのかは俺には分からんが、>>291 の日本語に混乱していると推測してみた。
PHP で XSL 変換してブログを行おうと思うんだが、クライアントごとに逐一サーバーで動的変換しようか、ローカルで HTML ファイルなどを静的生成しようか迷ってる。
商用サイトなどならともかく、ブログ程度なら静的に行うべきなのかな。
でも、動的だとコンテントネゴシエーションとかブラウザ振り分けなどの恩恵が……うーむ。 Φは空集合やろ
blog∩xslt = Lenyaに附属してたblogのサンプル
だと思うが、出来はいまいちだった <item id="a">
<created>2004-01-03T00:00</created>
<modified>2004-01-04T00:00</modified>
</item>
<item id="b">
<created>2004-01-02T00:00</created>
<modified>2004-03-01T00:00</modified>
</item>
<item id="c">
<created>2004-02-01T00:00</created>
</item>
これら item 要素の子 created・modified 両要素の内容を選別して親の item 要素を新しい順 (b・c・a) に並べ替えたいのですが、例えば以下のように xsl:sort 要素を使ってもうまくできません。
<xsl:apply-templates select="item">
<xsl:sort select="created or modified" order="descending"/>
</xsl:apply-templates>
助けてくださいお願いします。 >>295
"or"は論理演算子だからここで使っても意味ないよ(T/Fが返ってくる)。
select="created[not(../modified)] | modified"
でどう? xsl:copy-of で属性値を取得できません。
xsl:value-of なら属性値を取得できました。
-- xml --
<a href="http://example.org/"> example </a>
-- xsl --
<xsl:copy-of select="/a/@href" /> <br />
<xsl:value-of select="/a/@href" /> <br />
-- output --
<br />
http://example.org/ <br />
--
xsl:copy-of を使用して属性値を取得する方法をご存知の方がいらっしゃいましたら、
その方法をお教え下さいませ。 それだと copy-of でコピーされるのは属性ノードだからそのままでは出力で
きない。どうしてもしたいならこんな感じで、
<xsl:copy-of select="string(/a/@href)"/>
非ノードにしたものを渡せばよい。でも value-of のほうが適切。 value-of を使うことに致します。ありがとう 次のようなXMLデータがあるとき、
name="foo"の前後のitemのname属性値を表示するようなXSLTはどう書けばいいんでしょうか?
<list>
<item name="hoge" />
<item name="foo" />
<item name="bar"/>
</list> <xsl:value-of select="item[@name='foo']/preceding-sibling::item[1]/@name"/>
<xsl:value-of select="item[@name='foo']/following-sibling::item[1]/@name"/>
かな。試してないけど。
>>301
それで成功しました。
ありがとうございます。 <root>
<mage>
<mage>
<take>
<toge>
みたいな構造になっているXMLファイルがあって(上では閉じタグ省略)、
いまrootから何階層目にいるのかを知るにはどうしたら良い? >>304
count(ancestor::node())
でどうよ? 天気予報は既存の配信ビジネスを守るためにRSS配信できない
http://neta.ywcafe.net/000339.html
国民の税金で気象データの収集・解析までしておきながら、
気象庁の官僚の天下り先である
・財団法人 気象業務支援センター
・財団法人 日本気象協会
の利権保護の為、未だRSS配信が拒まれているのだ。
将来的に行われるであろう地震予知の情報も、有料で国民に販売するつもりだろうか? >>306
是非はともかくそんなとこのソースを元に騒いでんの?w >>307
じゃあまずガソリンスタンドをたたいてくれ。 306,307 は気象庁を、
310 はガソリンを、
308,311 は住民を、
各自、自由に叩いてください。
313 は XSL/XSLT ネタ、よろしく。 XSL/XSLT/ネタではなく
XSL/XSLTのネタよろしく。 <a id="a0">
<b id="b0">
<c>foo0</c>
<c>bar0</c>
</b>
<b id="b1">
<c>foo1</c>
<c>bar1</c>
</b>
</a>
のようなデータから、<c>の値を2つ指定して最初に出てくる共通の親要素を
見つけるにはどうすればよいでしょうか?
例えば、"foo0"と"bar0"なら "b0"、"foo0"と"foo1"なら"a0"がほしいです。
共通の親をすべてならなんとかなるのですが、
その中で最初にマッチする親だとさっぱりわかりません。
よろしくおねがいします。 >>315
(descendant::c[. = 'foo0']/ancestor::*[./descendant::c[. = 'bar1']])[last()]/@id 後で考えたら、えらい無駄な事をしてるな、と。
/descendant::c[self::node() = 'foo0']/ancestor::*[descendant::c = 'foo1'][position() = 1]
これでも、共通且つ最初にマッチする先祖を得られると思う。
>>316
ありがとうございます。いけそうです。
再帰ばっかり考えてました。
自分のXPath能力の無さに(´・ω・`)ショボーン 質問です。
XSLT で <a href="javascript:foo('bar')">...</a> のようなタグを生成したいのですが、
引用符のエスケープの仕方がよくわかりません。ご存知の方、ご回答をお願いいたします。
現在はこんなコードを書いてます (エラーになります)
<a href="{concat('javascript:foo(', ''', @bar, ''', ')')}"> >>319
化けてしまいましたが、''' のところは '&apos;' です。 >>319
<xsl:attibute> を使えばいいのですね。自己解決しますた。お騒がせしました。
こういう事ですね?
<xsl:element name="a">
<xsl:attribute name="href">javascript:foo(&apos;bar&apos;)</xsl:attribute>
<xsl:apply-templates />
</xsl:element>
コピペするならこっち
<xsl:element name="a">
<xsl:attribute name="href">javascript:foo('bar')</xsl:attribute>
<xsl:apply-templates />
</xsl:element>
アンカー・テキスト不変なら、こっち
<xsl:element name="a">
<xsl:attribute name="href">javascript:foo('bar')</xsl:attribute>
アンカー・テキスト
</xsl:element>
XSLT Standard Library
ttp://xsltsl.sourceforge.net/
exsltみたいなライブラリ集だけど、こっちの方が実用的? XML SchemaからXSLTの雛形というかスケルトンというか
土台を出力してくれるようなツールって無いでしょうか?
フルスクラッチで作るの、面倒じゃないですか? data1.xmlというファイルがあって中にxslファイルの参照先も書いてあるとします。
<xml...
<xslt:sheet1.xsl.....
<DataList>
<Data ID="0">
<String>データ0</String>
</Data>
<Data ID="0">
<String>データ0</String>
</Data>
<Data ID="0">
<String>データ0</String>
</Data>
</DataList>
このdata1.xmlファイルをdata1.xml?id=0みたいな呼び出し方をしてxslファイルにid=0という値を渡す方法ってあるのでしょうか?
URLを打ち込むときに
data1.xml?id=0と打ち込み、ID=0の商品に関する情報だけを
表示したいんです。
URLで打ち込んだデータをXSL内の変数に取り込みたいのです。
現在だと、hrefつかってもIDの数だけxmlファイルを作成しないと
いけなくなってしまうんです。 >>328
今更ながら、xsltで全て作成してjavascriptでlocation.queryから引数受け取ってwindowのロード時に違うノードサクージョ すいません質問があります。
MSXSLを用いて変換を行おうとしているのですが
コマンドを打ち込んだときに
必要な属性'{http://www.w3.org/1999/XSL/Transform}version' が見つかりません
という変なエラーメッセージが出てしまいます。これはどうすればいいんでしょうか? すみませんが誰かご教授下さい。 (マルチポストで申し訳ありません)
XMLのあるタグの属性が同じレベルのタグの属性とダブっっている時、
変換後にその属性のダブった部分を除きながら属性を並べたい場合は
どうすればよいでしょうか?
例えば
xml
<a>
<ele id="1"/>
<ele id="2"/>
<ele id="2"/>
<ele id="3"/>
<ele id="4"/>
<ele id="4"/>
<ele id="4"/>
<ele id="5"/>
</a>
を変換して
1 2 3 4 5
にするようなXSLを教えていただきたいのです。
よろしくお願いします。 <xsl:stylesheet xmlns:xsl="http://www.w3.org/(ry xmlns:aws="http://abc.com/"
exclude-result-prefixes="human">
<xsl:for-each select="people/person/age">
ここで別のXMLを取ってくる
<xsl:apply-templates select="human:hobbies/human:hoby" />
</xsl:for-each>
<xsl:template match="human:hobby"> ああっ、途中で送ってしまった… orz
>>334のようにやると下のテンプレートの中身へ行かない?ようなのですが
どこに問題があるのでしょう? >>332
もう解決してるのかもしれんが
//ele[not(@id=following-sibling::node()/@id)]/@id
とかでどうすか? xmlをエクセルから作ってるんですが、日付が1900年形式でだされてしまいます。
それを表示する際に、dd-mmm-yyのフォーマットで表示したいんですが、どうすればよいでしょうか?
http://exslt.orgのテンプレート使ってやってみたんですが
すごい遅くなりました。前もってデータを変換してXMLをつくった
方が良さそうです... ノード名じゃなくて値がQNameのときに、それが特定のNSに属してるかってどうやって判断できる?
<先祖のどこか xmlns:x="http://pc8.2ch.net/test/read.cgi/php/">
...中略...<ここ この属性の値をチェックしたい="x:999654569"/>
node系関数のnamespace-uri()は値は見れないし、
string系の関数じゃ、xが本当にhttp://pc8.2ch.net/test/read.cgi/php/なのかわからん。
ずうっと名前空間宣言を全部フォローして自分で覚えとくしかないのか? XMLもXSLもXSLTも何も知りません。
Aに1・2という情報?属性?を付けて
Bに2・3を付けて
Cに1を付けて
1が付いているのはA・C
2が付いているのはA・B
3が付いているのはB
というように表示するにはどうすればいいでしょう >>340
> XMLもXSLもXSLTも何も知りません。
勉強しろ。アフォか。 System.out.println("1が付いているのはA・C");
System.out.println("2が付いているのはA・B");
System.out.println("3が付いているのはB");
いや>>340的にはこっちのほうがわかりやすかろう。
MsgBox "1が付いているのはA・C", vbInformation
MsgBox "2が付いているのはA・B", vbInformation
MsgBox "3が付いているのはB", vbInformation
デフォルトの名前空間が指定されている時、プレフィックスの無い Element は XPath でどう表現すればいいの?
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="design.xsl"?>
<hage:root xmlns="http://example.com" xmlns:hage="http://example.com/hage/">
<item1>あいうえお</item1>
<item2>かきくけこ</item2>
</hage:root>
こんな XML から "あいうえお"を取り出したいんだけど /hage:root/item1 じゃうまくいかないみたい。 スタイルシート側(desin.xslのことか?)の名前空間の設定はどうなってる?
携帯だからアドバイスしづらいな…。
まあ多分スタイルシートではxmlns="XHTMLのURI"とかやってると思う。
(これ自体は問題ないし下手にprefixつけるとUAが出力結果をXHTMLとして認識できない。)
でもこの場合あんたのスタイルシート内のXpath式内でitem1を指定しても
それはXHTMLでのitem1要素を指定していることになっている。
もちろんあんたはそんなもの扱った覚えは無いだろうしXHTMLにもそんな要素はない。
正しく処理させるには名前空間について勉強してくれ。
ソースXML文書のprefix無い方の名前空間のURIを$aとおくと、
スタイルシート側にxmlns:omanko="$a"を書き加えXPathではomanko:item1と
指定すればいい。xsl:の部分とかも不都合があればばんばん書き換えればいいから。
携帯からだから妙ちくりんな書き方になったが頑張ってくれ
んじゃ 質問です。
UTF8で配信されるXMLをSHIFT_JISでHTML化したい
場合は
@JAVAのXMLパーサーとか使う
AperlとかphpでSOAP
なんていう方法しかありませんか?
現在はXSLTで簡単にスタイルシートあててやってますが
SHIFT_JISで出力するのは無理ぽ。。です。
どうにか方法はありますのでしょうか。。
携帯サイトを運営しているのですが
UTF8じゃ文字ばけするぞゴラァ!という
クレームが多くて困ってます。 >>346
XSLTのoutput要素のencoding属性使ってもうまくいくと思う。
まぁ、XMLパーサ使ってフィルタプログラム作成するなり、既存のフィルタツールなり使ったほうが
柔軟性はあるが。
<<サンプル>>
■data.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="data.xsl" ?>
<root>
<data>あああ</data>
<data>いいい</data>
</root>
■data.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="html" encoding="Shift_JIS" />
<xsl:template match="root">
<html><head><title>utf8->SJIS</title></head><body>
<xsl:for-each select="data">
<xsl:value-of select="text()" /><br />
</xsl:for-each>
</body></html>
</xsl:template>
</xsl:stylesheet> >>347氏
ご丁寧に有難う御座います。
<xsl:output method="html" encoding="Shift_JIS" />
なんてタグがあるなんて知りませんでした。。orz
早速、その方法を試してみました。
結果報告
@PCブラウザで見る(IE)
ホワイトアウトしてしまいました。
右クリでエンコード指定でシフトジスにすると表示されました。
A元からUTF8対応携帯で見る
文字化けしてしまいました。
Bシフトジスしか対応していない携帯で見る
うまく表示されるようになりました。
つまり 今まで見えてた@Aは見えなくなりましたが
Bは見えるようになりました。
恐らくブラウザ側ではUTF8として認識しているためだと
思います。
素直にphpのxmlパーサーとかでやりつかね・・・
(php5入ってないので・・・SOAP無理ぽ)
>>348
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
を挿入してみたらどうですかね。 >>348
phpでサーバサイドでのXSLT変換か。取りあえず、UTF-8からShift_JISへの変換はできたみたいだね。
phpの話になってスマンが、もしかして、header('Content-Type: text/html; charset=UTF-8');とかなってる?
header('Content-Type: text/html; charset=Shift_JIS');にしてみたら、もしかしたら動くかもね。 >>349
>>350
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
もやってみましたが、同様の結果でした。
どうもXSLTだけでの解決は難しそうなので
PHPでやってみます。
変更できたらまたご報告します。
(ちょちょっとPHPのXMLパーサ関数でやってみましたが、できそうです。) >345
わざわざ携帯から長いレスをサンクス
俺のレスの前が3ヶ月前だったので回答は期待できないと思ってスレみてなかったよorz
結局質問してから別の場所で答えを見つけたんだけど、
XSL で XPATH 書いても XSL で定義した既定のネームスペースは XPath には適用されないってことなんだよな。
なんでそんな変な仕様なのか理解に苦しむけど。
てことで、 XML の既定のネームスペースを XSL 側では Prefix 付きで定義することで解決しました。
ちょっとYOUはまだ勘違いしてるかも…。そこらへんはXSLTはまともな仕様でつよ。
もっと名前空間のよさを感じてちょうだい!!!!
そして私は ttp://www2.xml.gr.jp/log.html?MLID=xmlusers&N=5831
あたりを見て >352 のような結論に至ったわけだが、なんか勘違いがある?と思って
改めてリンク先のスレッドを読んでると
ttp://www2.xml.gr.jp/log.html?MLID=xmlusers&N=5842
に
> さらに、XPath式中のQNameを展開するときには、以下のルールが成り立ちます。
> 2. プリフィックスがついていない場合、ネームスペースURIはnullになる。
とあるな。確かに勘違いしてたかも。
> そして私は
続きが気になるよ(´・ω・`)
どうか教えてください。
AWSでxsltを始めたばかりです。
<img>
<xsl:attribute name="src">
<xsl:value-of select="aws:MediumImage/aws:URL" />
</xsl:attribute>
<xsl:attribute name="width">
<xsl:value-of select="aws:MediumImage/aws:Width" />
</xsl:attribute>
<xsl:attribute name="height">
<xsl:value-of select="aws:MediumImage/aws:Height" />
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="$amazon_item_name" />
</xsl:attribute>
</img>
とすると、<img src="http://images.amazon.com/images/P/xxx.jpg" width="xxx" height="xxx" alt="xxx">になってしまい、閉じタグをいれることができません。
xsltでどう指定すると閉じタグをいれることができるのでしょうか? <xsl:output method="xml"/>
をxsl:stylesheetの直下に入れる、かな。
XHTMLでないHTMLとして出力されていると思われ。 >>356
どうもありがとうございます。
おっしゃる通りの方法でできました。
ただ、新しい問題が発生しました。
お付き合いいただけましたら嬉しいです。
xslt で出力される html は単独の html ではなく
ある html ファイルの <body> 内に include させたいと考えています。
今までは <xsl:output method="html" /> としていて、問題はありませんでしたが
<xsl:output method="xml" /> や <xsl:output method="xhtml" /> にすることにより
xslt によって出力される html の1行目には <?xml version="1.0" encoding="UTF-8"?>
が入ってしまうようになってしまいました。
つまり、<body> 内に <?xml version="1.0" encoding="UTF-8"?> が入ってしまいます。
文法的には問題ないようですが、なんだか気持ち悪いです。
xhtml や xml で出力するのではなく、text みたいな形で出力した方が適当でしょうか? ゴメンナサイ。
ググったら見つけました。
<xsl:output method="xml" omit-xml-declaration="yes" /> とすると、XML 宣言をしないようにできるようですが
実際には出力されてしまいます。
なにかおかしいですかね? どっちでもいいけど
alt="{$変数名}"
とは書かないの?
call-templateする予定があるとか??
あと最初以外にXML宣言入るのは文法の問題あるよ。
ただUAが無視してくれているだけだけど。 今アマゾンウェブサービスでXSLファイルを書いてるのですが
何故かVersion=2005-09-15だと、StyleにXSLファイル指定してもうまくいきません。
AWSでXSLやるときの条件みたいなものって何かありますか? XSLTを書いていると、かなり長くなってしまったんですが、XSLTファイルをモジュールや関数みたいに分割することはできますか。
仕様書をみたけど、それらしい機能が見つかりませんでした。 >>364
ありがとう。スタイルシートの取り込みってあったから、てっきりCSSのことだと思ってた。
XSLTファイルじたいがスタイルシートなのね。べんきょうになりますた。 XSLについて質問です。
DBから取得したデータをXMLに出力し、それをXSLTでXSLに変換かけたいと思ってます。
そこで下記のコードなんですが
<A>
<B key="test1" value="aaa1" />
<B key="test2" value="aaa2" />
</A>
<C>
<D value="" />
</C>
Dのvalueの値にBのvalueの値を入れたいと思ってます。
イメージ的には、/D/@value = /B/key["test"]@value ?? なんですが、/A/B[1]/@valueのように
番号ではなくkeyの名前で参照するにはどうやればよいのでしょうか。
/child::A/child::*[attribute::key='str']/attribute::value
でいけると思われ。
(child::は省略可、attribute::は@に置換可)
結論を言うと、XPathの勉強をおすすめする。 child::*はchild::Bにした方がいいかもしんね。
strにはkeyの値を入れるんだよ。 出来ましたありがとうございます。
本来なら勉強しなきゃいけないんですが、助かりました。 ソースは
http://www.wakkaya.com/test/a.xmlと
http://www.wakkaya.com/test/a.xslです。
まず、
<data><a>あああ2003</a><b>21</b></data>
<data><a>あああ2004</a><b>30</b></data>
<data><a>あああ2005</a><b>14</b></data>
<data><a>いいい2003</a><b>30</b></data>
<data><a>いいい2004</a><b>45</b></data>
<data><a>いいい2005</a><b>80</b></data>
<data><a>ううう2003</a><b>99</b></data>
<data><a>ううう2004</a><b>77</b></data>
<data><a>ううう2005</a><b>46</b></data>
という感じのxmlがあります。
<a>に2005が含まれている箇所だけ抽出し、
<b>の大きい順に並べ替えるようにしてから番号を振るようにします。書くと
<xsl:sort select="b" order="descending" data-type="number" />
<xsl:if test="contains(a, '2005')">
<tr>
<td><xsl:number value="position()" /></td>
<td><xsl:value-of select="a" /></td>
<td><xsl:value-of select="b" /></td>
</tr>
</xsl:if>
という感じです。いざxmlを見てみると番号が1、2、3とならずに
2、4、9となるのです。どうやれば1、2、3と表示されますか?
どなたかご教授下さい。何卒宜しくお願い致します。 positionはfor-eachでselectした時点で決まるので、selectの時点で2005を含むかどうか調べる。
<xsl:for-each select="data[contains(a, '2005')]">
<xsl:sort select="b" order="descending" data-type="number" />
<tr>
<td><xsl:number value="position()" /></td>
<td><xsl:value-of select="a" /></td>
<td><xsl:value-of select="b" /></td>
</tr>
</xsl:for-each> >>371
うまくいきました!
本当に助かりました。有り難う御座います。 連続質問ですみません。ソースは引き続き
http://www.wakkaya.com/test/a.xmlと
http://www.wakkaya.com/test/a.xslです。
今度は、<b>の中身が空の場合は表示しないようにしたいのです。
<xsl:choose>
<xsl:when test="b=''">
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="data[contains(a,'2005')]">
<xsl:sort select="a" order="acsending" data-type="text" />
<tr>
<td><xsl:number value="position()" /></td>
<td><xsl:value-of select="a" /></td>
<td><xsl:value-of select="b" /></td>
</tr>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
と、<a>順で並べ替えるようにしたのですが、しっかり空の要素も表示されてしまいます。
ちなみに、xsl:for-each 以下に xsl:choose を入れると、例のごとく番号が2から始まります。
対処法をお教え頂けませんでしょうか?本当に度々ですみません。 >連続質問ですみません。ソースは引き続き
とか書くと相手にされない件 XSLTで変数使えるのは分かったんだけど、
「x=x+1」のような
インクリメントってできないの?
>>374
すみません。気を付けます。
>>376
アドバイスあるが等御座います。
もすこしfor-each やifやwhen勉強して出直してきます・・・ >>379
仰せの通りXPathについていろいろ調べたことろ、
<xsl:for-each select="data[contains(name, '3') and uriage > 0 ]">
とするだけでNaNをはじくことが出来ました。
なんか凄い初歩的で恥ずかしい質問であるにもかかわらずお答え下さった皆様方、
この度は誠に有り難う御座います。
これを機会にXPathを精進・・ >>380
ていうかお前にはxmlはおろかwebそのもののセンスも無いからやめとけ 遅すぎるお前のレスもセンスがねーよw 2chやめろな。 >>380
低脳が。センスのないHPもさっさとたたみな
キモイんだよ、デザインが HPって「たたむ」って表現するんだ・・・初めてしったよ >>386
と思ったらもうインストローリングされてました。
私の記述ミスです。
本年もよろしくご指導のほどお願いいたします インストローリング の検索結果のうち 日本語のページ 約 286 件 バージョン2が勧告候補になりますた。
早めに勉強しましょう。 >>390
新機能とか変更点を簡潔に説明したサイト教えてけれ。 >>344
数ヶ月ぶりに自己レス
/[local-name()="root" and namespace-uri()="http://example.com"]/item1
でどうだろう?
>>393
いや、だから>>345がスタイルシートの中でURIが一緒な
任意のプリフィクスを付けろとアドバイスしてるだろう。
なんでそんな面倒なことするの。しかも間違ってるし。 >>393
まず名前空間から勉強し直せ、ゴラァァ!! >>344を書いたの俺だけど間違っているかもしらん。すまん。
XPath式にてdefault namespaceを指定しようとしたら、
nullなnamespaceになるのをならないと勘違いしていた。
とりあえずXPath式内でdefault namespaceのnodesを指定したければ
default namespaceのURIを別のprefixにも指定すればOKだと思う.
(XMLでは一つのURIを複数のprefixに充ててはいけないルールは無い)
まあこんなnullpoな俺だがcandidateなXPath2.0のspecificationをプリントして見てます。
今のところlearnした事柄:
・やっぱり名前空間の仕組みはアレだからdeprecateらしい
・型についての概念が出てくる。XML Schemaの知識が必要。
・XPath2.0はXPath1.0のスーパーセットだお。つまり1.0の式が2.0でも通用するお。
・2.0は少なくともXSLT2.0とXQuery1.0で使用されるお。
・シーケンスっつーのはアイテムたちの順序ある並びだお
・アイテムというのはノードと、リテラルチックな”値”のことだお
もっとセンセーショナルな事実が解ったらまたカキコするお。
でも駄目人間の俺より仕様書を信用するべきだお。
またもや携帯からの書き込みだから妙なことになってるかもしらん。
バイバイ 某所より誘導されました。
XSLT(XPath)で、Textや属性のQNameってどうやって調べれば良いんでしょうか?
例えば、
<ns0:boards xmlns:ns0="http://2ch.net">
<board nick="ns0:webprog"/>
<board nick="ns0:tech"/>
<board nick="ns0:unix"/>
</ns0:boards>
で、
「値が、名前空間が"http://2ch.net"でローカル名が"webprog"の値を持つboard要素」って、
どうやって調べればよいのか…。
全然知らないんですがXPath1.0じゃだめでXPath2.0の●●じゃないと無理とかあるんでしょうか。 >>397
何故、属性値の内容が展開されるんだ?
基本的にはstringだろ?
>>397
詞ね
<xsl:template match="/boards/board[@nick=concat(name(namespace::*[.='http://2ch.net']),':webprog')]">
<xsl:value-of select="@nick"/>
</xsl:template> うひ(^_^;)
ありがとうございます。
頂いた答えをヒントにして、苦節1時間、やっと出来ました。
<xsl:template select="/ns0:boards/board/@nick[../namespace::*[local-name(.)=substring-before(string(../@nick),':')] and substring-after(.,':')='webprog']">
<xsl:value-of select="."/>
</xsl:template>
しかし、なんでこんな普通の選択のためにゴリゴリ書くんでしょう…。
>>399が言ってることがまっとうで、
XSLT/XPath/XMLSchema?の仕様の方が逝かれてるのではないか、という気がしてきます…。
>>399
XMLSchemaではQNameという型があります。>>397のnickのように使われます。
よく?使われる例は、
<hoge xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<value xsi:type="xsd:string">123456789</value>
</hoge>
だと、/hoge/value の値は、文字列”123456789”で、
<hoge xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<value xsi:type="xsd:int">123456789</value>
</hoge>
だと、/hoge/value の値は、32bit整数 123456789 で、
<hoge xmlns:tns="http://www.2ch.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<value xsi:type="tns:code">123456789</value>
</hoge>
だと、/hoge/value の値は、名前空間http://www.2ch.netで定義されたcode型の123456789、
なんて事になります。
でも、その直感はあながち間違いでもないように思えるのは、>>402に書いたとおりです。 値がドキュメントの構成から離れて利用できないこと自体が逝かれてる。
よっぽどのアホがこんな仕様作ったんだろう。 >>403
なるほど、スキーマで使うのか
ボヘミアンな俺には縁が無さそうだが、
一つ勉強になった
でもよ、データ型が必要なら、それを前提としたもの、
例えば、XPath1.0より2.0を使った方がいいんじゃね?
貴族がボヘミアンを振る舞えったって、やっぱりぎこちないだろ XPath1.0だどQName型と言う概念が無いから、string型で辻褄を合わせなきゃならんけど
2.0は型情報を前提としている貴族主義だから、QName型ならQName型で処理できるんじゃないかな。
...と言いつつ、俺もよく分からん。
でも、XSLT・XPath1.0ってのは「シンプル・イズ・ベスト」を信仰するボヘミアン派だから、
如何せんXMLSchemaとは相性が良くないと思う。 他人と話がしたいなら一般的でない形容はやめたらどうだ? XMLユーザの貴族とボヘミアンって一般的でないのか? XML 貴族 ボヘミアン の検索結果のうち 日本語のページ 約 510 件中 1 - 100 件目 (0.29 秒)
>>413
510件という数字は多いのか?少ないのか?
Googleまで持ち出して何が言いたいんだ?
……という風に突っ込まれたくなければ意図不明瞭な一行レスをやめろ。
自分の発言に自信が持てないから逃げ道を作ってるんだよ察してやりなよ
そしてスルーしてやりなよ みんなは貴族なの?
オイラはどうしても「型情報」って奴についてけねえだけどな。
DTD+DateTypeで十分だと思うがな... まぁついてこられない人が居るのは否定しないのが貴族 今ASP.NETでRSSの読み込み・表示をしているのですが
RSS1.0はとりあえず表示できたのですが、RSS2.0が全然ダメです
XSLTファイルのRSS2.0を表示させるソースってどこか公開されていませんか? <foo count="10" />
とある場合、特定の処理を @count 回ループさせたいんですがどうすれば良いんでしょうか?
ループカウンタ付きのループ for(i=0; i<@count; i++) みたいな感じなんですけど、<xsl:for-each> じゃ
要素とかの集合しか指定できないですよね? >>421
「XSLT 再帰処理」でGoogle検索してみれ すげぇ、ループを再起呼び出しでやるとは気づかなかったw こいつは関数型言語みたいなもんだから
むしろ再帰の方が自然なんだな >>423
他の方法で、できんことも無いけど、再帰が真っ当。
これを制せば、XSLTをほぼ手中に入れられる。 ファイルメーカーのアプローチってどう思う?
ウェブプログラミングにxsltって有効? ファイルメーカーが何やってるか知らんが
静的な部分は XSL で、動的な部分は XML で作れるならデータ転送量を
最小限に押さえられるので有効だと思う。サーバの負荷分散にもなるし。
ただ未対応ブラウザに対応するなら逆に高くなるかもしれん。 拡張関数(?)のexsltで本日の日付を取得したいのですが
クライアントサイドの一般的なパーサは対応しているのでしょうか?
処理としては要素の日付と本日の日付を比較して過去の情報は隠すという動きをさせたいです。
exsltが無理ならスクリプトでやってみます。 >>428
クライアントサイドの一般的なパーサって、どんなん?
IEやMozillaに付いてくような奴だったら駄目じゃね? IE の XSL 対応って 5.0 からだっけ? Mozilla はどこから対応してんの? XML → HTML で © や は XSL にどう記述したら良いの? ありゃ、© や は、です。 XML + XSL で XSL って作れる?
一般ユーザ用と管理者用で XSL を分けてたんだが、2〜3 のパラメータと条件分岐だけで
統合できそうなのが分かってきた。ただ一般ユーザには管理者用の XSL を見せたくないし。 XSLからXSLを出力するならxsl:namespace-aliasとかでぐぐると良いよ。
ブラウザごとの XSL 対応状況の一覧とか載ってるサイトご存知でしたら教えてたも m(_ _)m 一生懸命変換PGを作っていたのにWord2003で出来ちゃうのね。。。 Firefox 1.0.7 (Linux) で <xsl:value-of> の disable-output-escaping="no" が
利かないみたいなんですけど何か振替策ないでしょうか? すみません、no じゃなくて yes です。ちょっとネットで漁ってみましたが
Mozilla 開発者連中は W3C の解釈だとか何とか言い訳付けて修正しないそうです (なんだそりゃ)。
結局の所、中で 2 回パースしてる部分が遅くなるだとか、XML+XSLで生成した HTML が Valid で
あるという前提で設計しちゃったので手を入れたくないとかってのが本音っぽい。
ふと思いついて JavaScript で innerHTML に設定してみたらとりあえず回避できたっぽいのでご報告まで。
<xsl:value-of select="foo" disable-output-escaping="yes" />
↓
<input type="hidden" name="" id="foo" value="{foo}" />
<span id="bar"></span>
<script language="javascript">
document.getElementById("bar").innerHTML = document.getElementById("foo").value;
</script>
御教授願います。
ループを回し表を作成したときに、1行毎に指定された内容をセットしてmailを送りたいのですが上手くいきません。
以下はループの内部処理です。
・$q_indexには表の登録番号(行番号)がセットされています。
・メールのテンプレートをjavaScriptで作成しています。
<xsl:variable name="url_id">url_<xsl:value-of select="$q_index"/></xsl:variable>
<A target="_blank" href="" id="$url_id" charset="">メール送信</A>
<script lang="javaScript">
$url_id.href='mailto:xxxx@xxx.co.jp?subject=' + [行毎に定義されたmailテンプレ];
</script>
最初は上記のように書いていました。
これで表を作ると、1件目はメールを送れたのですが、2件目以降メーラーが開かないというバグが発生してしまいました。
理由は<A>タグで定義してるIDパラメータが"$url_id"という文字列で固定されていた為です。
2件目以降も同じ名前が定義されている為エラーになっているようでした。
そこで下のように改造を試みたのですが、ここで問題が発生しました。
<xsl:variable name="url_id">url_<xsl:value-of select="$q_index"/></xsl:variable>
<A target="_blank" href="" id="<xsl:value-of select="$url_id"/>" charset="">メール送信</A>
<script lang="javaScript">
<xsl:value-of select="$url_id"/>.href='mailto:xxxx@xxx.co.jp?subject=' + [行毎に定義されたメールテンプレ];
</script>
この様にした場合、<A>タグのIDパラメータが不正となってしまいます。
お聞きしたいのは、<A>タグのIDパラメータに変数$url_idを定義したいのです。
どなたか上手い方法をご存知無いでしょうか?
自己解決したので書いておきます。
直接変数内のデータを参照したい場合、{}で括ればいいらしいようです。
<xsl:variable name="url_id">url_<xsl:value-of select="$q_index"/></xsl:variable>
<A target="_blank" href="" id="{$url_id}" charset="">メール送信</A>
<script lang="javaScript">
<xsl:value-of select="$url_id"/>.href='mailto:xxxx@xxx.co.jp?subject=' + [行毎に定義されたメールテンプレ];
</script>
$を文字列として使いたいんだけど、
どうすればいいの? <xsl:text>$</xsl:text>
<![CDATA$]]> >>447
これでうまくいきました。本当にありがとうございます。 awsのxslの一部です。
- <Arguments>
<Argument Name="AssociateTag" Value="sfeesv-22" />
<Argument Name="ItemPage" Value="1" />
<Argument Name="SubscriptionId" Value="0QRaadwa2" />
<Argument Name="Keywords" Value="ハリーポッター" />
<Argument Name="ResponseGroup" Value="Request,ItemIds,OfferFull,VariationSummary,ItemAttributes,EditorialReview,Images,Reviews" />
<Argument Name="Operation" Value="ItemSearch" />
<Argument Name="Service" Value="AWSECommerceService" />
<Argument Name="SearchIndex" Value="Electronics" />
<Argument Name="Sort" Value="salesrank" />
</Arguments>
コレをxsltのfor-each分で値を返します。Argumentだけを抜き出します。
-----
<xsl:for-each select="aws:Argument">
<xsl:value-of select="@Name"/>
<xsl:value-of select="@Value"/>
</xsl:for-each>
-----
値がずらずらっと返ってきました。ここで<Argument Name="ItemPage" Value="1" />の部分だけ値を返したくないのですが、xsltにどのように書き加えればいいのでしょうか? <xsl:for-each select="aws:Argument[@Name != 'ItemPage']"> >>451
ありがとうございます。
試してみた結果、ばっちり成功でした XMLからXMLに変換したいんですけど、
XSLTに<xsl:output method='xml' encoding='SHIFT_JIS'/>
みたいな感じで書いているのに
出力されるXML宣言が<?xml version="1.0" encoding="UTF-16"?>
と出力されるのは何ででしょうか?
ちなみにXMLファイルの変換には
VS2005VC++でIXMLDOMDocumentPtrのtransformNode()を使用しています。 えっと、XML 文書を XSL で HTML に変換し、
それに CSS を適用して見せるページを作っています。
意図するように見えているのですが、
Firefox がどのような HTML に変換しているのかを
確認したいと思っています。
Firefox で XSL による変換結果をファイルに
保存することってできますか?
つまり XSL 適用後の文書を保存したい、
Firefox を単に XSL プロセッサとして使いたいのです。 XML ファイルの先頭で XML プロセッサに対して XSL ファイルを指示しますよね?
<?xml-stylesheet title="XSL_formatting" type="text/xsl"
href="http://resource.example.com/sample.xsl" ?>
XML プロセッサとして Firefox を利用すると、
XML ファイルをおいてある場所以外の XSL ファイルを
指定した場合に「Security Error」になります。
これはいかんともしがたいのでしょうか? Security Errorのあとにコロンがついてエラーの内容が書いてない?
セキュリティ上、別ドメインからのスクリプトの呼び出しはダメとかじゃなくて? Security Error: Content at http://example.com/test.xml
may not load data from http://orz.2ch.net/test.xsl
表示内容は上記の通りです。スクリプトと同じで他のドメイン
からの XSL ファイルは信用しないよってことですか。
全部ローカルにおいてたら Gecko でも IE でも処理
できるファイル群なので、ファイルの内容自体に誤りはないと思います。
CheckSameOriginError, Security Error: Content at %S may not load data from %S. セキュリティエラー: %S のコンテンツが %S からデータを読み取ることは禁止されて います。 IE だと http://example.com/ を信頼済みサイトに
登録することで、他のサイトの XSL ファイルも
ダウンロードして処理してくれるようになりました。
Firefox ではそれに対応する設定を見つけられませんでした。
身内で共通の CSS とか XSL 使おうと思ってて
どうせ内容いじれるのが自分だけなんで一カ所に
集めちゃおうと思ったんですが、セキュリティの
こと考えたらなんか根本的に間違ってた気がするので
あきらめます。 ところで、 XPath による要素・属性の指定において、
「ルート直下の a または b という要素の下にある c という要素」
に関するテンプレートを書きたい時って、
/a/c に対するものと /b/c に対するものを別に
書く必要がありますか?まとめて /{a|b}/c のように記述
する方法はありませんでしょうか?
<Arguments>
<Argument Name="Service" Value="" />
<Argument Name="AssociateTag" Value="test" />
<Argument Name="ItemPage" Value="1" />
</Arguments>
xsl:value-of selectを使って、testの値だけ抜き出したいのですが、
どのように書けばいいんでしょうか? たまたま弄ってた所だから特別に教えてやる
Arguments/Argument[@Name='AssociateTag']/@Value
入門書くらい買え
ちがってたらゴメンネ >>464
どうもありがとうございます。
うまくいきました! document関数は外部のサイトも取得できるんでしょうか? やってみよう!
わからなかったら聞いてみよう!
わかったことはみんなに知らせよう!
いけ! がんばって見た結果、たぶんできるっぽいです。
ところで
<xsl:for-each select="document('http://test.xml')
見たいにurlを入力したとき、urlに=だとか&だとかが入っているとエラーが出てしまいます。
どうやって書けばいいんでしょうか? &は&だったかな。?だったかもしれない。
=はそのままでよかった気がする。
ttp://www.ne.jp/asahi/minazuki/bakera/html/reference/charref すまん、参照がともに変換されてしまったorz
示したURLのページをもとにがんばってくれ。 xml文章の中から、ユーザー側から入力した条件を元に、
検索して結果を表示するようなことは、xslのみで実現するのは可能でしょうか?
postができなそうなのでやっぱり不可能でしょうか? >>472
CGIでやるなら、いまのところCGIからXSLTプロセッサを呼び出すしかない。
>>474
やっぱそうなりますよね。
xml文章中の特定の語句を検索して表示するような、
スクリプトが紹介されていたので、
postができれば検索システムも作れるそうだなと思った次第です。
>>473
xslって簡易プログラミング言語みたいなものだと思っていたので、
変な言い方だったらすみません。 文字列をエンコードする関数って
どんなのがありますか? postされたデータを使ってXSLTを作り変換すれば?
xsl:if の test 部分をpostされたデータにすれば出来そうな気がする document関数でurlを指定するとき、xsl:variable nameはつかえないんでしょうか?
<xsl:variable name="●●">○○.xml</xsl:variable>
<xsl:for-each select="document($●●)/▲▲/■■">
</xsl:for-each>
こんな感じで入力すると、$●●に○○.xmlが入らずに
$●●のままなんですが・・・ すみません、XML で特定の条件に一致する要素だけにちょっとした変更を
加えたいのですが、それ以外の要素を無変換で出す処理はどう書けば良いの
でしょうか? 例えば XML 中の password という要素の内容をマスクする場合:
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="*">
<xsl:choose>
<xsl:when test="name(.)='password'">
<password>****</password>
</xsl:when>
<xsl:otherwise>
<xsl:element name="(ここはどうすれば?)">
<xsl:for-each select="@*">
<xsl:attribute name="(ここはどうすれば?)"><xsl:value-of select="." /></xsl:attribute>
</xsl:for-each>
<xsl:apply-templates select="node()" />
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="password">
<password>****</password>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
ただし、password要素が空でないネームスペースに属しているならば、予めxmlns:foo="http://..."としておいて、match="foo:password"としなければならない。
xmlns="http://..."としておいてmatch="password"としてもだめ。 >>482
お、出来た! W3C の <xsl:copy> のところに書いてありますね。意味が分からんかったのでスルーしてましたが。 すみません、文字列の一括置換は XSL でどうやったら良いんでしょうか。
XML から JavaScript の文字列リテラルに変換するときにエスケープする必要があるのですが。
<foo>say "good morning"</foo>
↓
var msg = "say \"good morning\""; XSLT内で外部のJavaScriptファイルを読む宣言をするとIEでホワイトアウトするのですが。
諸事情により内部に直接JavaScriptを書きたくなくて。。
どうしたらよいのでしょうか?
document関数はXMLしか読み込めないよ。Javascirptを読もうとするとエラーになるので多分それでホワイトアウトしてる。
<script src="(スクリプトのURL)"/>
みたいな要素を出力した方がよいかと。
#エスパーレベル低いので外してるかな? 分かりにくい書き方してすんません。
で、ご指摘の方法でやっていたんですがうまくいきません。
むしろJavaScriptソースを直接書けば動きます。
Firefoxならどっちでもちゃんと動くんですけど。。
もう少し詳しく状況を説明しておくと
・JavaでXSL変換を行っている
・変換後データはStringとして吐き出される
・それをそのままサーブレットのPrintWriterを使って表示
してます。
>487
<script src="(スクリプトのURL)"/> でリンクしたJSファイルと
PrintWriterが吐くページのエンコーディングが合ってないとかか? >487
文字コードはすべてUTF-8で統一してあります。
さらに、response.setChar〜でUTF-8を設定してあるので完璧。。だと思います。
javascriptのソース次第でなんとなりそうな気もしてきたのでとりあえずそっちで試行錯誤してみます。 変鉄もないxmlファイルのルート以下のタグ名をmethodはhtmlで表示させるだけのxsltがなにも表示されません。
環境のせいだと思うのですがIE5で動作しますか?
起動時は拡張子xslのファイルをダブルクリックするだけです。
事情により環境をいじれないので確認させてください。
よろしくおねがいします 元となるXMLにXSLTを<?xml-stylesheet ...?>で関連付けて、そっちを開けばOK。
492
記述が漏れていてごめんなさい。
手順はそのようにしています。 XML+XSLTのformからPostされたページをリロードすると、
データの再送信が行われないんだけど、
これってXSLで再送信するように変更することはできる? JavaScript のリテラル部分に値を埋め込みたいんだけど、" → \" とかの変換て XSL でどうやるの? テンプレートの呼び出しについてですが、
呼び出されたテンプレートで、呼び出し元の要素名を使いたいです。
どのようにすればいいですか? 俺もテンプレートで聞きたいことが。
例えば
<fruit>
<apple>うまい</apple>
<banana>あんまりすきじゃない。</banana>
フルーツ。
</fruit>
っていうXMLがあったとして、
「フルーツ。」の部分にテンプレート適用したいんだが、
XPathとかで指定できないの? XQuery, XSLT 2 and XPath 2 Are W3C
Recommendations
だそうな。
>>497
呼び出し元が親の場合:
select="local-name(..)"
そのほか、親の親なら"local-name(../..)"
親以外から呼ばれる場合:
呼ぶ方:
<xsl:apply-template select="ほげほげ">
<xsl:with-param name="parent" select"."/>
</xsl:apply-template>
呼ばれる方:
<xsl:template match="ほげほげ">
<xsl:param name="parent"/>
<xsl:value-of select="local-name($parent)"/>
</xsl:template>
>>498
<xsl:apply-template select="text()"/>
ただし、appleとbananaの間などの空白や改行にも適用される。
>>455
半年以上経っているが…
Firefoxでページほぼ全てを選択(全部はダメ)→
右クリックから「選択した部分のソースを表示」
これで行ける。 手詰まってます。質問させてください。
servletでIEにXMLを返却して、サーバに置いてあるXSLTを読ませて画面を表示させたいです。
↓レスポンスのXML
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="サーバに置いてあるXSLTのパス"?>
:
画面の表示はできたのですが、レスポンスが異常に遅いです。
HTTPのリクエストを確認したところ、
IEがサーバからXMLを受け取ってから、XSLTに対して再度HTTPリクエストを投げるのに時間がかかっているようです。
これはIEのXMLプロセッサ(MSXML)の問題なのでしょうか?
そうなのであれば、レスポンスを向上させる手段としてどういった方法が一般的なのでしょうか?
何かご存知の方、いらっしゃいましたら助言いただきたいです。
よろしくお願いします。
XSLT入門ページにあるような簡単なXMLで試してみましたが、結果は同じでした。
>503
IEにXMLの変換をやらせるんじゃなくて、サーバ側で変換した結果をクライアントにかえしたら? XSLT2.0/XPATH2.0が勧告されているんだが...
興味無いか...○| ̄|_ 力いっぱい亀レスしてみる。
>>484
<xsl:template match="foo">
<xsl:text>var msg = "</xsl:text>
<xsl:call-template name="escape">
<xsl:with-param name="str" select="."/>
</xsl:call-template>
<xsl:text>";</xsl:text>
</xsl:template>
<xsl:template name="escape">
<xsl:param name="str"/>
<xsl:if test="string-length($str) != 0">
<xsl:variable name="char" select="substring($str,1,1)"/>
<xsl:choose>
<xsl:when test="$char = '\'">\\</xsl:when>
<xsl:when test="$char = '"'">\"</xsl:when>
<xsl:when test="$char = ' '">\n</xsl:when>
<xsl:when test="$char = '	'">\t</xsl:when>
<xsl:otherwise><xsl:value-of select="$char"/></xsl:otherwise>
</xsl:choose>
<xsl:call-template name="escape">
<xsl:with-param name="str" select="substring($str,2)"/>
</xsl:call-template>
</xsl:if>
</xsl:template> SourceForge.net: PHP - XML_XSLT2Processor
http://sourceforge.net/projects/xslt2processor/
JavaのXSLT2.0プロセッサ(SaxonとAltovaXML)をPHPで使えるようにするためのクラスらしい
ttp://xiss.g.hatena.ne.jp/orzccc/20080301/php_xslt2processor 経由 すいません、XSLTの使用を今日から検討し始めたド初心者です。
掲示板の様な物を作成する為に、掲示板のタイトルと本文と書き込み日時をXMLで出力するPHPを書き、
別途表示の為のXSLTをスキンとして固定ファイルで用意しようと考えているのですが、
この方式で何処まで出来るのかがわからず、戸惑っています。
質問1:
例えば掲示板で良くある処理として、「3日以内の書き込みの場合にタイトルの最後に[最新情報]と追記する」等がありますが、
掲示板XMLのデータが「タイトル」「本文」「書き込み日時」しかなかったとした場合に、
XSLT側で[最新情報]と追記する方法はあるのでしょうか?
質問2:
仮に固定ファイルのXSLTでは「質問1」の処理が出来ないと仮定した場合での質問なのですが、
これらの処理の実現方法として、PHPで作成されるXML側で日付を判断し、
<status>NEW</status>
等を挿入しておくという方法を考えてみたのですが、
XML+XSLTでこの様な方法は一般的に行われているのでしょうか。(変じゃないですか?という事です^^;)
質問3:
XSLTを使う目的が「掲示板のスキン(見た目)変更をしやすく」といった目的なのですが、
質問1や質問2で例に挙げたような機能をいくつも追加した場合、
かえってスキンPHPファイルを用意してそれを変更するほうが簡単になってしまうのではないかと思ってしまいます。
スキン機能をXML+XSLTで実現するか、PHPで実現するか、どちらの方が良いか率直なご感想をお聞かせ願えないでしょうか?
(XSLTであればこんな時便利なはず!等etc...) A1.
無理
A2.
俺だったら要素じゃなくて属性を使うかもだけど
まあ好きにすればいいんじゃないの
A3.
世の中XSLTに対応したブラウザばかりじゃないとか
XSLTで込み入ったことをやろうとすると果てしなく面倒くさいとか
そもそもXMLにこだわる必要がどれだけあんのかとか
いろいろ思うことはあるけど
まあ好きにすればいいんじゃないの XSLTってどうみても帯に短し襷に長しだよな
もっと割り切った仕様にすればいいのに
中途半端に文字列処理とか入れるから xalanを実行するときに元のXML文書に文書型宣言が含まれていると、xalanが
validationを行いDTDを毎回ダウンロードしてしまうのですが、これを止める
ことはできないでしょうか。xalanはjava版でバージョンは2.7.0-5です。
XSL-FOのテーブルで
<fo:table>
<fo:table-row>
<fo:table-cell><fo:block>(短いテキスト)</fo:block></fo:table-cell>
<fo:table-cell number-rows-spanned="2"><fo:block>(すごく長いテキスト)</fo:block></fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell><fo:block>(短いテキスト)</fo:block></fo:table-cell>
</fo:table-row>
</fo:table>
これをレンダリングするとセルの大きさが
-------------------------
|********|**************|
|--------|**************|
|**** |**************|
| |**************|
| |************ |
| | |
-------------------------
このようになってしまいますが、左の列の高さを均等にする方法内でしょうか
事前に計算しろという選択肢は無しで XMLファイルAの中の要素1に入っている、
「〜〜.html%3FA」
というURLを
xslで、
<xsl:value-of select="要素1"/>
と指定して変換したXMLを見ると、%3FAの部分が「?」に
なってしまって、リンクできないんですけど、対処法
ご存知の方居ませんかね? 521ですが、どうも勘違いしていたようで。。。
<xsl:value-of select="要素1"/> の指定でも出力されたXML自体は
のソースちゃんと%3FAになってました。
%3FAを エンコード済みの?と解釈してしまっている側の問題ですね、
本質的には。
ただ、ブラウザを弄るのは現実的ではないので、何とかxsl側で対処
出来ないでしょうか。 お騒がせしてすみません。
出力されたXMLをhtmlにもう一回変換して
ブラウザから見たらちゃんとしたURLへの
リンクに成ってました。
RSS出力してた時はリンクが上手く飛ばなかった
んですが、同じ<a〜〜>のタグでも、ブラウザは
RSSとHTMLで違う解釈するんですね、、、 使い方によっては面白いんで適当に使い始めたけど
PHPだと言語側の対応がイマイチで使いづらいんだ。
「なにがなんでもXML」みたいな風潮じゃなくなったのもあるかな for-each使って、指定したノードが存在する回数分、テキストを配置していくプログラムが作りたいです。
fo:block-containerで直接的に画面内での座標指定をしているため、その時の周回の回数から座標をY方向に計算してズラしながら配置していきたいです。
CやJavaでは、forの構文では、この中でiを見ればいま何週目か?を参照できます。
for(int i=0;i<回数;i++){
〜処理〜
}
が、
XSLTのfor-each文(もしくはその他)で、これと同じように、内部から「現在何回目か」を見る方法ってありますか?
xsl:variableでは変数なのに代入はできないそうで困ってます。 >>528
ループの中で何番目か調べるのはposition()
<xsl:for-each select="/parent/child">
<xsl:value-of select="position()" />番目のノードです
</xsl:for-each>
ただし最初が0でなく1なので要注意 >>529
ありがとうございます。
ループに関しては思ったとおりのことができました。
XSLTでは、再代入できる変数のようなものを使うことは不可能ですか?
ループ以外でも、XSLT内で計算するために、蓄積的に数値を足していける変数を使いたいのですが。 そういうのはcall-templateのパラメータを使う XSL:FOの構文で、HTMLで言うところの<hr>に相当するタグってありますか? 自宅サーバ用に XSLT サーブレット作ったんで良かったら使ってください。
sourceforge.jp でソース公開してます。
http://www.koiroha.org/kwt/xsl/index.xhtml <良スレ:age />
既に前レスから半年、ここ、まだ誰かいるかなぁ
XSLTで、例えば元データにaltタグが無ければ変換をエラーにするといったことは出来るのでしょうか?
簡易html-lintとして使えると嬉しいっす 質問です。
@のような構造のXMLがあり、
@に従うデータがAのような形できます。
Aにおいて、Aは親で、BはAの子、
CはBの子となっており、Bのような形に変換したいです。
このときxsltではどのようにかけばよろしいでしょうか?
@ABのイメージは次レスで書きます。 -----------@----------
<choice>
<element type="A">
<element type="B">
<element type="C">
<choice>
-----------A-----------
<A>
<B>
<C>
<C>
<B>
<B>
<C>
-----------B-----------
<A>
<B>
<C></C>
<C></C>
</B>
<B></B>
<B>
<C></C>
</B>
</A> いまいち何がやりたいんだかよく分からないけど
XMLじゃないデータ (2) をXMLであるデータ (3) に変換したいってこと?
だったらそれはXSLTの仕事ではない xmlのツリーに、いくつものbookDescriptionがあります。
<table>
<bookDescription>
<bookCode>
<price>100<price>
</bookCode>
<title>X</title>
〜〜〜
</bookDescription>
</table>
な感じで、bookDescriptionをpriceでascendingで表示したいと思います。
xsltで<xsl:sort select="bookCode/price" order="ascending"/>を入れるとエラーが出でしまいます。
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<xsl:apply-templates />
</html>
</xsl:template>
<xsl:template match="table">
<body>
<h2>Test</h2>
<xsl:apply-templates/>
</body>
</xsl:template>
<xsl:template match="bookDescription">
<!--<xsl:sort select="bookCode/price" order="ascending"/>-->
</xsl:template>
<xsl:template match="bookDescription">
<table border="1">
<tr>
<td><xsl:value-of select="bookCode"/></td>
<td><xsl:value-of select="title"/></td>
</tr>
</table>
<br />
</xsl:template>
</xsl:stylesheet>
どうすればいいのでしょうか? にーとがひまつぶしに実験したので間違えてる可能性大ですが
こう書くとエラー無くそれらしく表示されました
<xsl:template match="table">
<body>
<h2>Test</h2>
<xsl:apply-templates>
<xsl:sort select="bookCode/price" order="ascending"/>
</xsl:apply-templates>
</body>
</xsl:template> >>543
無事できました。
ありがとうございます。 ◎2chスレッド勢いランキングサイトリスト◎
★+ニュース板
・ 2NN (推薦)
・ 2chTimes
★+ニュース板新着
・ 2NN新着
・ Headline BBY
・ unker Headline
★+ニュース板その他
・ Desktop2ch
・ 記者別一覧
★全板
・ 全板縦断勢いランキング (推薦)
・ スレッドランキング総合ランキング
・ ログ速
★全板実況込み
・ 2勢 (推薦)
・ READ2CH
・ i-ikioi
※ 要タイトル名検索
※ 2chブラウザ併用推奨 俺が当初に言ったとおり、
糞な技術だったよなこれw 会社で使ってるんだけど、
これ覚えてて需要あるかな?
自分、ただのプログラマ テンプレート各種あるが、たいがいデータベース操作まで書けちゃうよな。
この現状を一言で言うと、PHP化。
マジアホかと思う。
統一的にテンプレートはXSLTだけで良くないか?
分離がわりと明確。
資格があるからスタッフの最低限能力を保てる。
少なくともこれらのメリットがある。
デメリットは、「&」とかかな。
しかし、資格があるから、ここらへんのマークアップの初歩くらいはクリアできている人を雇えるわけで、問題無いか。 誰でも簡単にネットで稼げる方法など
参考までに、
⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。
グーグル検索⇒『半藤のブブイウイウレレ』
8YYDKVBRAU ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ 米航空宇宙局(NASA)の火星探査車「パーシビアランス」が18日午後(日本時間19日午前)、火星への着陸に成功した。高温にさらされながら猛スピードで突入する難題を乗り越えた。土の中から微生物が存在した兆候を見つけ出し、地球外生命の痕跡を探る。
NASAによると、探査車と母船を載せたカプセルが時速2万`bで火星の大気圏に突入。パラシュートを広げて減速し、母船が重さ1dの探査車をつり下げて表面に下ろした。機体の表面が1300度以上になるなど「恐怖の7分間」と呼ばれる困難な着陸を無事果たした。2020年7月に地球を出発していた。
着陸したのは、湖があったとみられる直径45`bのクレーター。カメラや分析装置を積み込んだ探査車が動き回り、土壌や岩に含まれる物質を調べる。地面に穴を掘って採取した土壌サンプルは将来、別の探査機で地球に持ち帰る計画だ。
数十億年前の火星は地球に環境が似ていたとされる。今よりも温暖で液体の水が流れており、微生物が存在した可能性がある。地球外生命の痕跡が見つかれば、生命誕生の謎を解く手がかりが得られる。
NASAが火星に探査車を送るのは5機目。火星にはアラブ首長国連邦(UAE)や中国も探査機を周回軌道に投入したばかりだ。中国は5月にも着陸させる。米国は将来、火星への有人着陸も目指しており、パーシビアランスで得た情報を役立てる。 ローマ・カトリック教会のフランシスコ教皇は、ウクライナでの戦争について「おそらく何らかの方法で誘発されたか、あるいは阻止されなかった」との認識を示した。14日刊行の伊紙に掲載された所見の中で述べた。
報道によると教皇は先月19日、キリスト教関連の文化的出版物に携わる団体の責任者と言葉を交わした中で、「我々が今目の当たりにしているのは残虐かつ凶暴な行為に他ならない。こうした戦争を遂行している部隊は大半が傭兵(ようへい)であり、ロシア軍がこれを活用している」と指摘。同軍がチェチェン人やシリア人を含む傭兵を進んで送り込んでいると付け加えた。
「しかし危険なことに我々は、この点にしか目を向けていない。確かに恐ろしい話ではあるが、それだけでは全体像が見えず、戦争の裏で何が起きているのかが分からない。おそらくこの戦争は何らかの形で誘発されたか、あるいは阻止されなかったのだろう。兵器のテストや売却に関心が向いている印象も受ける。とても悲しいが、基本的に今重要視されているのはこうしたことだ」(フランシスコ教皇)
さらに教皇は、ロシアのプーチン大統領を「支持」するわけではないとしつつ、「複雑な問題を善悪の区別に単純化しようとするのは断じて反対だ。根源的な要因や利害関係について考えることが不可欠で、それらは非常に入り組んでいる」と分析。「我々はロシア軍の凶暴さや残虐さを目の当たりにしてはいるが、解決を目指すべき問題があることを忘れてはならない」と続けた。