トップページ⇒php
547コメント219KB

XSL/XSLT

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。01/09/05 10:49ID:dYMWGvtU
語ろう。ていうか教えて。
025625004/02/23 13:14ID:???
>>251
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias">
<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>
<xsl:template match="/">
<axsl:stylesheet>
<axsl:template match="/">
<foo bar="{'{aaa}'}"/>
</axsl:template>
</axsl:stylesheet>
</xsl:template>
</xsl:stylesheet>
こういう場合。
今試してみたらxsltproc(Using libxml 20604, libxslt 10102 and libexslt 802)だとunmatched '}'とパースエラーが出て、xalan 2.3.1だと問題無く処理できる。
xsltprocでもattribute要素使えば処理できる。

>>252
xsltはxmlなので読みやすいようにスタイルシートを適用してブラウザで見るのが良いかと。
直接編集できないけど。リアルタイムでスタイルシートを適用してくれるxmlエディタならできるかな?
エディタはEmacsでxml-lite-modeを使っている。xsltプロセッサはメインがxsltprocで変な動きをしたときはxalan。
タグの閉じ忘れがチェックできるだけでもだいぶ違うよ。
0257nobodyさん04/02/25 08:26ID:Hbu4YFmr
XSLTって自分自身を出力するスタイルシートは書ける?
0258nobodyさん04/03/24 22:07ID:QhqWFZPy
xhtml文書をxsltprocで変換したいと思ってるんだけど、
xhtml側のnamespaceの状態よってマッチしたりしなかったりするので困ってる。
----- test.xsl -----
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="html"/>
</xsl:stylesheet>
-----------------
[実行例] $ xsltproc.exe -v test.xsl test.xml 2>&1 | grep xsltProcessOneNode

----- test.xml -----
<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml"/>
-----------------
xsltProcessOneNode: no template found for /
xsltProcessOneNode: no template found for html

このようにマッチしない。でも、namespaceを消したり名前を付けたりするとマッチする。

----- test.xml -----
<?xml version="1.0"?>
<html xmlns:xhtml="http://www.w3.org/1999/xhtml"/>
-----------------
xsltProcessOneNode: no template found for /
xsltProcessOneNode: applying template 'html' for html

何故?また回避策は?

#現象が再現できる最小のソースです。validなxhtmlに対しても同様です。
0259nobodyさん04/03/24 22:10ID:???
2行目×状態よって○状態によって
xsltprocはCygwin版libxslt1.1.2-1です。

$ xsltproc --version
Using libxml 20604, libxslt 10102 and libexslt 802
xsltproc was compiled against libxml 20604, libxslt 10102 and libexslt 802
libxslt 10102 was compiled against libxml 20604
libexslt 802 was compiled against libxml 20604
0260nobodyさん04/03/29 11:53ID:???
namespaceというのは要素の苗字に当たります。
xmlns="http://www.w3.org/1999/xhtml"
と指定することは、この要素とその子孫要素の内プレフィックスの付いてないものの苗字は"http://www.w3.org/1999/xhtml"ですよと宣言することで、
xmlns:xhtml="http://www.w3.org/1999/xhtml"
と指定することは、この要素とその子孫要素のうちxhtmlというプレフィックスが付いているものの苗字は"http://www.w3.org/1999/xhtml"ですよと宣言することです。
ですから1番目のtest.xmlのhtml要素はhttp://www.w3.org/1999/xhtmlという苗字を持ったhtml要素ということになります。
一方2番目のtest.xmlのhtml要素にはxhtmlというプレフィックスが無いため苗字無しのhtml要素となります。

test.xslでは苗字無しのhtml要素にマッチするようになっているため1番目のtest.xmlにはマッチしませんが2番目のtest.xmlではマッチします。

解決するためにはtest.xslのxsl:template要素にxmlns="http://www.w3.org/1999/xhtml"と宣言を加えるか、
xmlns:xhtml="http://www.w3.org/1999/xhtml"と宣言を加えてxsl:templateのmatch属性を"xhtml:html"とします。
これで苗字付きのhtml要素にマッチするようになります。
0261nobodyさん04/03/29 12:55ID:???
pc2鯖が消える前の>>258への解答ローカルで持ってるけど上げる?
0262nobodyさん04/03/29 13:12ID:???
貼っときますね

260 :nobodyさん :sage :04/03/26 13:09 ID:???


----- test.xsl -----
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:h="http://www.w3.org/1999/xhtml">
<xsl:template match="/h:html"/>
</xsl:stylesheet>
-----------------

あるいは

----- test.xsl -----
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:h="http://www.w3.org/1999/xhtml">
<xsl:template match="/"><xsl:apply-templates select="h:html" /></xsl:template>
<xsl:template match="h:html"/>
</xsl:stylesheet>
-----------------

とかどうですか。
xmlns:h=".." は xmlns=".." にしておいて
match="/html" あるいは match="/h:html" などでもいいだろうけど。
0263nobodyさん04/03/29 13:14ID:???
続き

261 :nobodyさん :sage :04/03/26 13:27 ID:???


>>260
で、できた!ありがとう!

でも、なんでこうなるの?
XML側にネームスペースがなかったり、名前付けされてたらマッチして、
デフォルトネームスペースがあるとマッチしない理屈がわかんない。
仕様?バグ?ポインタだけでも教えてもらえるとありがたい。

あと、>>260さんは何で知ってるの?(まさか、これFAQ?)
0264nobodyさん04/03/29 13:20ID:???
以上削除前の263でした。

262 :260 :sage :04/03/26 14:48 ID:???

>>260 の訂正
>xmlns:h=".." は xmlns=".." にしておいて
>match="/html" あるいは match="html" などでもいいだろうけど。

>>261
test.xsl で xmlns:h="http://www.w3.org/1999/xhtml" が無い場合、
match="html" でマッチするのは
名前空間無し + "html"
という要素だと思う。

で、XHTML のほうは
<html xmlns="http://www.w3.org/1999/xhtml"> ... </html>
なってたら、html 要素は内部的には
名前空間 "http://www.w3.org/1999/xhtml" + "html"
になってる。

名前空間無し + "html"
と
名前空間 "http://www.w3.org/1999/xhtml" + "html"
は違ってる。なのでマッチしない。

そこで、>>260 に書いたみたく、XSLT の側でマッチさせる対象を後者の
ような名前空間 + "html" なものになるよう指定しなきゃいけない。

<html xmlns:xhtml="http://www.w3.org/1999/xhtml"/>
と書いた場合は、<html の html は「名前空間無し + "html"」になる。
プリフィックスで xhtml に "http://www.w3.org/1999/xhtml" を割りあててる
から、これはデフォルトプリフィックス使ってる <html そのものには影響しない。
0265”削除”後の26004/03/29 18:58ID:???
(´・ω・`)
0266nobodyさん04/04/02 00:28ID:I+SOWEa+
・foo.xml
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="foo.xsl"?>
<body>
<ruby><rb>This</rb><rt>ディス</rt></ruby> <ruby><rb>is</rb><rt>イズ</rt></ruby>
<ruby><rb>a</rb><rt>ア</rt></ruby> <ruby><rb>pen</rb><rt>ペン</rt></ruby>!
</body>

・foo.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.or/Profiles/XHTML-transitional">
<xsl:output indent="yes" method="html"/><xsl:template match="/">
<html><body>
<xsl:for-each select="body">
<xsl:for-each select="ruby">
<xsl:value-of select="rb" />
</xsl:for-each>
</xsl:for-each>
</body></html>
</xsl:template>
</xsl:stylesheet>
で、
<html xmlns="http://www.w3.or/Profiles/XHTML-transitional">
<body>This is a pen!</body></html>
と出力させたいんだけど、
<html xmlns="http://www.w3.or/Profiles/XHTML-transitional">
<body>Thisisapen</body></html>
実際にはこう。どなたか知恵をお貸しください。おながいします。
0267nobodyさん04/04/02 03:16ID:???
'!'あたりを見るとXSLを理解してないような。

<xsl:template match="/">
<html><body>
<xsl:for-each select="(body|.//rb)/text()">
<xsl:choose>
<xsl:when test=".='?'">
<xsl:text> </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</body></html>
</xsl:template>

テストしてないので自信はないですが。頭と尻に余計なものがくっつくヨカン。
026826704/04/02 03:21ID:???
化けた。スマン。
<xsl:when test=".='&#10;'">
全角を置き換えて。
026926604/04/02 20:40ID:???
ありがとうございました。"!"は拾ってくれるようになりました。
<html xmlns="http://www.w3.or/Profiles/XHTML-transitional"><body>
Thisisapen!
</body></html>
しかし、上のように単語間のスペースは拾われないみたいです。
おっしゃるとおりXSLTはまだかじりたてなので、自分でも調べてみます。
0270nobodyさん04/04/02 20:50ID:???
自己レスです。xmlのほうのbodyタグに
xml:space="preserv"
と属性を加えたら期待通りの結果が得られました。
重ね重ねありがとうございました。
027126704/04/02 21:33ID:???
<xsl:preserve-space>というタグがありますけど…
あとxhtmlの識別子が間違ってますよ。
0272nobodyさん04/04/08 12:47ID:Pkn49QjT
<A>
 <B><C>○あいう</C></B>
 <B><C>100</C></B>
 <B><C>200</C></B>
 <B><C>○いうえ</C></B>
 <B><C>50</C></B>
</A>

を

<A>
 <B>
  <C>○あいう</C>
  <D>100</D>
  <D>200</D>
 </B>
 <B>
  <C>○いうえ</C>
  <D>50</D>
 </B>
</A>

に書き換えたいのですが、xpathで
1. /A/B/Cで○があるもの、もしくは○がないもの
2. 自分の一番近い兄で/A/B/Cで○があるもの
というのはどう表記されるでしょうか?
0273nobodyさん04/04/08 13:10ID:???
>>272
よく読んでいないけれど、ツリー構造の変更は XSL ではなくて、
DOM じゃないのか?
0274nobodyさん04/04/08 16:06ID:???
>>272
>1. /A/B/Cで○があるもの、もしくは○がないもの
starts-with(.,'○') か これを not() で囲う

>2. 自分の一番近い兄で/A/B/Cで○があるもの
>というのはどう表記されるでしょうか?
preceding::C[starts-with(.,'○')][1]

こんなでしょうか。ここから

<xsl:template match="/A">
 <A>
  <xsl:apply-templates select="B/C[starts-with(.,'○')]"/>
 </A>
</xsl:template>

<xsl:template match="B/C[starts-with(.,'○')]">
 <xsl:variable name="val" select="."/>
  <B>
   <C><xsl:value-of select="."/></C>
   <xsl:for-each select="following::C[substring(.,1,1) != '○']">
    <xsl:if test="preceding::C[starts-with(.,'○')][1] = $val">
     <D><xsl:value-of select="."/></D>
    </xsl:if>
   </xsl:for-each>
  </B>
</xsl:template>

これでとりあえずできるかと。要素数増えるとfor-each以下が効率悪そうだけ
ど。(.,'○')が顔文字にしか見えないのが欠点。
0275nobodyさん04/04/08 18:38ID:???
>>257
遅レスですが
<xsl:copy-of select="document('')/...."/>
ってこと?テンプレートとしては使えないけど。使えても意味ないけどね。
0276nobodyさん04/04/09 10:37ID:???
>>274
ありがとう。
元の処理に教えていただいたコードを入れて動かしたいと思います。
0277nobodyさん04/04/18 17:14ID:???
>>275
いや、C言語とかだと自分自身を出力するプログラムが書けるんですが
http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/quine.html
xsltの場合ネームスペースとかの関係で無理なんじゃないかと思って。
でもネームスペースを明示的に指定してやればできるのか?

documentで参照するのはアリなのかなぁ。
0278nobodyさん04/04/18 21:38ID:???
>>277
document('')で自分を参照するのは割と普通に使いますよ。自分は、ですが。
使ってるソースを目にすることもあります。

参照したデータはテンプレートとして使われることはないのでネームスペース
は(自分の少ない知識の範囲内では)そんなに問題にならないと思います。た
とえば

<xsl:template match="/">
<xsl:copy-of select="document('')//xsl:template[@match='/']"/>
</xsl:template>

これでも無限ループになる事はないです。もちろんこんなの意味ないので、別
のネームスペースを使って設定ファイル的なことをする方が一般的だと思います。
0279nobodyさん04/05/07 01:25ID:???
XSLTXTって使ってる人いますか?
ttps://xsltxt.dev.java.net/
ttp://www.zanthan.com/ajm/xsltxt/index.html

とりあえず < とか書かなくていいのがいい。
0280nobodyさん04/05/07 01:26ID:???
あ、&lt; です↑
0281nobodyさん04/05/09 20:35ID:???
>>279
> とりあえず < とか書かなくていいのがいい。
まともな XML オーサリングツール使えよ。
0282nobodyさん04/05/27 16:04ID:???
<li a="2300" b="hoge"/>
<li a="jiro" b="もっこり"/>
<li a="義雄" b="boke"/>
といったようなリストがあったとして、
属性b の値が hoge の時だけ 属性a の値を取りたいんですけど、
xpathではどうすればいいのでしょうか?
0283nobodyさん04/05/27 19:38ID:???
>>282

li[@b='hoge']/@a

かな。
0284nobodyさん04/06/04 12:24ID:???
<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は間違っているのでしょうか?
0285nobodyさん04/06/04 17:41ID:???
>>284
test="b and not(b='')"
単に "not(b='')" だけでいいかも。
028628404/06/04 20:42ID:???
>>285
> test="b and not(b='')"
うまくいきました!感謝!!
0287nobodyさん04/06/10 09:00ID:???
1ページの表示件数を10とかに指定して、
続きは<a>で次のページを表示させる…ってことは、
xsltでできるんでしょうか?
それともほかのプログラムと組み合わせたほうが賢明なんでしょうか?
0288nobodyさん04/06/11 16:14ID:???
サーバーサイドでやればできる。実際動かしてみたことある。
しかし素直にDOMとか使った方がいいかと。
028928704/06/11 20:00ID:???
>>288
DOMっすかあ・・・。
最近XMLに興味を持ち始めて、あとPHPも気になりだしたような、
プログラミングなんてまったくできない人間なので。
これから勉強していきたいと思います。ありがとう。
0290nobodyさん04/06/11 21:21ID:???
俺も一年くらい前からそんな感じで勉強してます。
0291nobodyさん04/06/14 05:46ID:???
PHP を使おうとは思うんだが、サーバーで動的生成か、ローカルで静的生成かで迷ってる。
ブログ程度なら静的にすべきなのかな。でも、動的だとコンテントネゴシエーションとかブラウザ振り分けなどの恩恵が……うーむ。
0292nobodyさん04/06/14 06:23ID:???
blog≠xml blog∩xml=Φ
blog≠xslt blog∩xslt=Φ

だと思うけど、違うのかな
0293nobodyさん04/06/14 06:47ID:???
>>292
Φ (ファイ) が何を意味するのかは俺には分からんが、>>291 の日本語に混乱していると推測してみた。

PHP で XSL 変換してブログを行おうと思うんだが、クライアントごとに逐一サーバーで動的変換しようか、ローカルで HTML ファイルなどを静的生成しようか迷ってる。
商用サイトなどならともかく、ブログ程度なら静的に行うべきなのかな。
でも、動的だとコンテントネゴシエーションとかブラウザ振り分けなどの恩恵が……うーむ。
0294nobodyさん04/06/15 10:23ID:???
Φは空集合やろ

blog∩xslt = Lenyaに附属してたblogのサンプル
だと思うが、出来はいまいちだった
0295nobodyさん04/06/23 11:34ID:1zBprzUE
<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>

助けてくださいお願いします。
0296nobodyさん04/06/23 14:51ID:???
>>295
"or"は論理演算子だからここで使っても意味ないよ(T/Fが返ってくる)。

select="created[not(../modified)] | modified"

でどう?
029729504/06/23 14:59ID:???
>>296
ありがとうございます。出来ました。
0298nobodyさん04/06/25 16:19ID:???
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 を使用して属性値を取得する方法をご存知の方がいらっしゃいましたら、
その方法をお教え下さいませ。
0299nobodyさん04/06/26 05:29ID:???
それだと copy-of でコピーされるのは属性ノードだからそのままでは出力で
きない。どうしてもしたいならこんな感じで、

<xsl:copy-of select="string(/a/@href)"/>

非ノードにしたものを渡せばよい。でも value-of のほうが適切。
030029804/06/26 21:02ID:???
value-of を使うことに致します。ありがとう
0301nobodyさん04/07/03 03:02ID:???
次のようなXMLデータがあるとき、
name="foo"の前後のitemのname属性値を表示するようなXSLTはどう書けばいいんでしょうか?

<list>
<item name="hoge" />
<item name="foo" />
<item name="bar"/>
</list>
0302nobodyさん04/07/03 04:31ID:???
<xsl:value-of select="item[@name='foo']/preceding-sibling::item[1]/@name"/>
<xsl:value-of select="item[@name='foo']/following-sibling::item[1]/@name"/>
かな。試してないけど。
030330104/07/04 00:41ID:???
>>301
それで成功しました。
ありがとうございます。
0304nobodyさん04/08/25 17:25ID:ly9L2Z7D
<root>
  <mage>
    <mage>
       <take>
  <toge>
みたいな構造になっているXMLファイルがあって(上では閉じタグ省略)、
いまrootから何階層目にいるのかを知るにはどうしたら良い?
0305nobodyさん04/08/25 18:19ID:???
>>304
count(ancestor::node())
でどうよ?
0306nobodyさん04/09/06 20:13ID:koFx6bH6
天気予報は既存の配信ビジネスを守るためにRSS配信できない
http://neta.ywcafe.net/000339.html

国民の税金で気象データの収集・解析までしておきながら、
気象庁の官僚の天下り先である
・財団法人 気象業務支援センター
・財団法人 日本気象協会
の利権保護の為、未だRSS配信が拒まれているのだ。
将来的に行われるであろう地震予知の情報も、有料で国民に販売するつもりだろうか?
0307nobodyさん04/09/07 09:26ID:???
二重徴税で叩けないのかな。
0308nobodyさん04/09/07 09:29ID:???
>>306
是非はともかくそんなとこのソースを元に騒いでんの?w
0309nobodyさん04/09/07 14:14ID:???
XMLのスレにマルチしまくってるから放置しとけ
0310nobodyさん04/09/07 17:02ID:???
>>307
じゃあまずガソリンスタンドをたたいてくれ。
0311nobodyさん04/09/07 21:05ID:???
気象庁職員必死だな(w
0312nobodyさん04/09/08 11:32ID:???
306,307 は気象庁を、
310 はガソリンを、
308,311 は住民を、
各自、自由に叩いてください。
313 は XSL/XSLT ネタ、よろしく。
0313nobodyさん04/09/09 02:59ID:???
気象庁住民はガソリンで逝ってよし。
0314nobodyさん04/09/09 09:57ID:???
XSL/XSLT/ネタではなく
XSL/XSLTのネタよろしく。
0315nobodyさん04/09/24 05:09:23ID:/pWgzu1/
<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"がほしいです。
共通の親をすべてならなんとかなるのですが、
その中で最初にマッチする親だとさっぱりわかりません。
よろしくおねがいします。
0316nobodyさん04/09/25 10:50:09ID:???
>>315

(descendant::c[. = 'foo0']/ancestor::*[./descendant::c[. = 'bar1']])[last()]/@id
031731604/09/26 08:08:17ID:???
後で考えたら、えらい無駄な事をしてるな、と。
/descendant::c[self::node() = 'foo0']/ancestor::*[descendant::c = 'foo1'][position() = 1]
これでも、共通且つ最初にマッチする先祖を得られると思う。
031831504/09/27 04:31:18ID:???
>>316
ありがとうございます。いけそうです。
再帰ばっかり考えてました。

自分のXPath能力の無さに(´・ω・`)ショボーン
0319nobodyさん04/09/28 17:39:48ID:???
質問です。

XSLT で <a href="javascript:foo('bar')">...</a> のようなタグを生成したいのですが、
引用符のエスケープの仕方がよくわかりません。ご存知の方、ご回答をお願いいたします。

現在はこんなコードを書いてます (エラーになります)
<a href="{concat('javascript:foo(', ''', @bar, ''', ')')}">
032031904/09/28 17:41:28ID:???
>>319
化けてしまいましたが、''' のところは '&apos;' です。
032131904/09/28 18:03:41ID:???
>>319
<xsl:attibute> を使えばいいのですね。自己解決しますた。お騒がせしました。
0322nobodyさん04/09/28 20:00:16ID:???

こういう事ですね?
<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(&apos;bar&apos;)</xsl:attribute>
<xsl:apply-templates />
</xsl:element>

アンカー・テキスト不変なら、こっち
<xsl:element name="a">
<xsl:attribute name="href">javascript:foo(&apos;bar&apos;)</xsl:attribute>
アンカー・テキスト
</xsl:element>
0323nobodyさん04/10/11 13:28:18ID:???
XSLT Standard Library
ttp://xsltsl.sourceforge.net/

exsltみたいなライブラリ集だけど、こっちの方が実用的?
0324nobodyさん04/10/14 23:53:23ID:DOJgSO2G
XML SchemaからXSLTの雛形というかスケルトンというか
土台を出力してくれるようなツールって無いでしょうか?
フルスクラッチで作るの、面倒じゃないですか?
0325nobodyさん04/10/15 00:48:57ID:???
>>324
スレ違いか
http://pc5.2ch.net/test/read.cgi/hp/1057198990/
0326nobodyさん04/12/06 00:30:36ID:???
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という値を渡す方法ってあるのでしょうか?
0327nobodyさん04/12/06 15:30:17ID:???
何言いたいんだかようわからん
0328nobodyさん04/12/06 15:34:45ID:jrlDRA4f
URLを打ち込むときに
data1.xml?id=0と打ち込み、ID=0の商品に関する情報だけを
表示したいんです。
URLで打ち込んだデータをXSL内の変数に取り込みたいのです。
現在だと、hrefつかってもIDの数だけxmlファイルを作成しないと
いけなくなってしまうんです。
0329nobodyさん04/12/23 23:41:54ID:???
>>328
今更ながら、xsltで全て作成してjavascriptでlocation.queryから引数受け取ってwindowのロード時に違うノードサクージョ
0330nobodyさん05/01/08 15:33:14ID:???
すいません質問があります。
MSXSLを用いて変換を行おうとしているのですが
コマンドを打ち込んだときに

必要な属性'{http://www.w3.org/1999/XSL/Transform}version' が見つかりません

という変なエラーメッセージが出てしまいます。これはどうすればいいんでしょうか?
0331nobodyさん05/01/08 17:10:58ID:???
330ですが
解決しちゃいました どうもです
0332nobodyさん05/01/10 19:16:25ID:???
すみませんが誰かご教授下さい。 (マルチポストで申し訳ありません)

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を教えていただきたいのです。

よろしくお願いします。
0333nobodyさん05/01/10 19:48:07ID:???
アホか。マルチポストに返答するわけ無いだろ。
0334nobodyさん05/01/22 19:16:33ID:WsL3wQoU
<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">
033533405/01/22 19:17:52ID:WsL3wQoU
ああっ、途中で送ってしまった… orz

>>334のようにやると下のテンプレートの中身へ行かない?ようなのですが
どこに問題があるのでしょう?
0336nobodyさん05/01/24 03:30:34ID:???
>>332
もう解決してるのかもしれんが
//ele[not(@id=following-sibling::node()/@id)]/@id
とかでどうすか?
0337nobodyさん05/01/30 14:52:43ID:0RSaGusl
xmlをエクセルから作ってるんですが、日付が1900年形式でだされてしまいます。
それを表示する際に、dd-mmm-yyのフォーマットで表示したいんですが、どうすればよいでしょうか?

0338nobodyさん05/01/30 20:37:49ID:0RSaGusl
http://exslt.orgのテンプレート使ってやってみたんですが
すごい遅くなりました。前もってデータを変換してXMLをつくった
方が良さそうです...
0339nobodyさん2005/04/09(土) 23:05:41ID:0FjmIeSR
ノード名じゃなくて値が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/なのかわからん。

ずうっと名前空間宣言を全部フォローして自分で覚えとくしかないのか?
0340nobodyさん2005/04/21(木) 17:08:59ID:???
XMLもXSLもXSLTも何も知りません。


Aに1・2という情報?属性?を付けて
Bに2・3を付けて
Cに1を付けて


1が付いているのはA・C
2が付いているのはA・B
3が付いているのはB

というように表示するにはどうすればいいでしょう
0341nobodyさん2005/04/21(木) 18:15:48ID:???
>>340
> XMLもXSLもXSLTも何も知りません。
勉強しろ。アフォか。
0342nobodyさん2005/04/21(木) 22:02:56ID:???
System.out.println("1が付いているのはA・C");
System.out.println("2が付いているのはA・B");
System.out.println("3が付いているのはB");
0343nobodyさん2005/04/21(木) 23:30:22ID:???
いや>>340的にはこっちのほうがわかりやすかろう。

MsgBox "1が付いているのはA・C", vbInformation
MsgBox "2が付いているのはA・B", vbInformation
MsgBox "3が付いているのはB", vbInformation
0344nobodyさん2005/07/29(金) 15:21:12ID:???
デフォルトの名前空間が指定されている時、プレフィックスの無い 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 じゃうまくいかないみたい。
0345nobodyさん2005/08/04(木) 10:02:40ID:???
スタイルシート側(desin.xslのことか?)の名前空間の設定はどうなってる?
携帯だからアドバイスしづらいな…。

まあ多分スタイルシートではxmlns="XHTMLのURI"とかやってると思う。
(これ自体は問題ないし下手にprefixつけるとUAが出力結果をXHTMLとして認識できない。)
でもこの場合あんたのスタイルシート内のXpath式内でitem1を指定しても
それはXHTMLでのitem1要素を指定していることになっている。
もちろんあんたはそんなもの扱った覚えは無いだろうしXHTMLにもそんな要素はない。
正しく処理させるには名前空間について勉強してくれ。
ソースXML文書のprefix無い方の名前空間のURIを$aとおくと、
スタイルシート側にxmlns:omanko="$a"を書き加えXPathではomanko:item1と
指定すればいい。xsl:の部分とかも不都合があればばんばん書き換えればいいから。

携帯からだから妙ちくりんな書き方になったが頑張ってくれ
んじゃ
0346nobodyさん2005/08/14(日) 13:37:07ID:XDX8Ip5H
質問です。

UTF8で配信されるXMLをSHIFT_JISでHTML化したい
場合は

�@JAVAのXMLパーサーとか使う
�AperlとかphpでSOAP
なんていう方法しかありませんか?

現在はXSLTで簡単にスタイルシートあててやってますが
SHIFT_JISで出力するのは無理ぽ。。です。
どうにか方法はありますのでしょうか。。

携帯サイトを運営しているのですが
UTF8じゃ文字ばけするぞゴラァ!という
クレームが多くて困ってます。
0347nobodyさん2005/08/14(日) 15:10:24ID:???
>>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>
0348nobodyさん2005/08/14(日) 18:40:08ID:???
>>347氏

ご丁寧に有難う御座います。
<xsl:output method="html" encoding="Shift_JIS" />
なんてタグがあるなんて知りませんでした。。orz

早速、その方法を試してみました。

結果報告

�@PCブラウザで見る(IE)
ホワイトアウトしてしまいました。
右クリでエンコード指定でシフトジスにすると表示されました。

�A元からUTF8対応携帯で見る
文字化けしてしまいました。

�Bシフトジスしか対応していない携帯で見る
うまく表示されるようになりました。

つまり 今まで見えてた�@�Aは見えなくなりましたが
�Bは見えるようになりました。

恐らくブラウザ側ではUTF8として認識しているためだと
思います。

素直にphpのxmlパーサーとかでやりつかね・・・
(php5入ってないので・・・SOAP無理ぽ)

0349nobodyさん2005/08/14(日) 18:50:00ID:???
>>348
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
を挿入してみたらどうですかね。
0350nobodyさん2005/08/14(日) 19:36:51ID:???
>>348
phpでサーバサイドでのXSLT変換か。取りあえず、UTF-8からShift_JISへの変換はできたみたいだね。

phpの話になってスマンが、もしかして、header('Content-Type: text/html; charset=UTF-8');とかなってる?
header('Content-Type: text/html; charset=Shift_JIS');にしてみたら、もしかしたら動くかもね。
0351nobodyさん2005/08/14(日) 22:31:27ID:???
>>349
>>350

<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
もやってみましたが、同様の結果でした。

どうもXSLTだけでの解決は難しそうなので
PHPでやってみます。

変更できたらまたご報告します。

(ちょちょっとPHPのXMLパーサ関数でやってみましたが、できそうです。)
03523442005/08/17(水) 20:33:45ID:???
>345
わざわざ携帯から長いレスをサンクス
俺のレスの前が3ヶ月前だったので回答は期待できないと思ってスレみてなかったよorz

結局質問してから別の場所で答えを見つけたんだけど、
XSL で XPATH 書いても XSL で定義した既定のネームスペースは XPath には適用されないってことなんだよな。
なんでそんな変な仕様なのか理解に苦しむけど。
てことで、 XML の既定のネームスペースを XSL 側では Prefix 付きで定義することで解決しました。
0353nobodyさん2005/08/18(木) 19:39:40ID:???
ちょっとYOUはまだ勘違いしてるかも…。そこらへんはXSLTはまともな仕様でつよ。
もっと名前空間のよさを感じてちょうだい!!!!

そして私は
03543442005/08/18(木) 22:02:59ID:???
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になる。
とあるな。確かに勘違いしてたかも。

> そして私は
続きが気になるよ(´・ω・`)
0355初心者2005/09/04(日) 03:53:09ID:???
どうか教えてください。
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でどう指定すると閉じタグをいれることができるのでしょうか?
0356nobodyさん2005/09/04(日) 10:59:31ID:???
<xsl:output method="xml"/>
をxsl:stylesheetの直下に入れる、かな。
XHTMLでないHTMLとして出力されていると思われ。
■ このスレッドは過去ログ倉庫に格納されています