メイン » 仕事の周辺 » XML

2005年03月31日

xsl:with-param

久しぶりにXSLTをさわってます。
昔かいたスタイルシートを訂正中、フォームに値がセットできていない個所を発見。
xsl:with-paramがうまく動かず、途中でなげてあったらしい(^^;)。
調べ直したら、原因らしきものを発見。
呼び出されるテンプレート側で<xsl:param>を用いて変数を宣言する必要があり、その際に変数の値は指定してはいけないのだそう。
何かこのあたりでけつまづいたのではないかと推測。

投稿者 idic : 12:50 | コメント (0)

2005年04月05日

XSLTで読めるはずのノードが読めない時は、ネームスペースを確認

Movable Typeが吐き出すatom.xmlを別のサーバーから読もうとしてまたまたドツボにはまってしまいました。
feedにネームスペースがくっついているのを見落としてしまったのが原因。
何故かノードが読めない不思議な現象(^^;)に数時間を無駄に過ごしてしまいました。
考えれば他所のサーバーからXMLをもらってくる時は、ネームスペースは常識でしょうが、普段クローズした世界でXMLを扱っているとついうっかり忘れてしまうのでした。
xmlns:dc="http://purl.org/atom/ns#"
を指定して
<xsl:for-each select="/*/*/dc:entry>
で無事読めました。

投稿者 idic : 18:57 | コメント (0)

2005年04月23日

XSLTによる日付フォーマットの変換

atom.xmlのcreatedノードの日付フォーマットが「2005-04-17T08:47:50Z」のようになっているのですが、これをYYYY/MM/DDにXSLTで変換する方法。
<xsl:value-of select="translate(substring(dc:created,0,11),'-','/')"/>
ハイフンとスラッシュの前のコーテーションマークを忘れてエラー、
ダブルコーテーションで囲ってエラー(^^;)。

投稿者 idic : 12:48 | コメント (0)

2005年05月10日

イベント情報のフォーマット

そういえばXMLの勉強を始めたそもそもの発端は、イベント情報の管理だったのでした。最近またイベント情報とかかわり始め、一から自分でやるのもなぁとWebを検索していたら、RDFカレンダーなるものと遭遇。iCalendarってXOOPSのカレンダーでも使っているやつですよね。昔からあったんでしょうか。
あちゃーもっと早く知ってれば、という感じですが、時間かかっても古いのも丸ごと書き換えですな、これは。

投稿者 idic : 12:34 | コメント (0)

2005年05月27日

ひとりっ子?

XSLTで兄弟がいるかどうかの判別

<xsl:if test="count(parent::*/child::*) &gt; 1">
親の子供の数を数えるのが一番かなぁ。 もっとエレガントな方法あるかも。

投稿者 idic : 12:29 | コメント (0)

2005年05月28日

引き続き兄弟関係

XSLTで末っ子を取得する last() があるのに、長男を取得する first() がない、と思ったら、単純に ノード名[1] とすればよいのでした(^^;)。

抽出後(position() が1になってしまう状態で)、抽出前の位置が知りたい時は、年上の兄弟の数を数えるのが一番か?

<xsl:value-of select="count(preceding-sibling::*) +1"/>

昨日から何をやっているかと言うと、 ← [現在位置/総数] → というようなリンクをつくってました。矢印出しっぱなしで、最後の場合は先頭に戻せ、と言われたもので今までに使ったことのないものが必要になったのでした。

投稿者 idic : 16:34 | コメント (0)

2005年06月02日

SOAP::Lite

SOAP::Liteで.NETで作成したWebサービスにアクセステスト中。
半角英数のキーワードを投げて問題なく情報をゲットできていたので、軽く考えていたのですが、日本語を登録してみたら、分けの分からない半角英数が登録されてしまう。
MySQL+.Netの時の悪夢が頭をよぎったのですが、
デバッグモードでやり取りされるXMLを書き出したところ、SOAP::Liteが全角文字をbase64で送っていて、これをWebサービス側がそのまま登録してしまっているらしいことが判明。
自分で書いたWebサービスですが、どこをどうやればbase64をデコードできるのか不明(^^;)。
分かりやすい送信(SOAP::Lite)側で

SOAP::Data->name(name => 'ほげ')->type('string'),
とすることで一応何とか解決。
WSDLを使えばもっと簡単にいきそうな気がするのですが、何故かうまく行かず、こちらはもう少し試行錯誤が続きそう。

投稿者 idic : 12:41 | コメント (0)

2005年08月13日

Access2003からWebサービスを使う

LAN内のファイヤーウオール越えのため、Webサービスを使うことが増えてきましたが、いちいちクラスを書かず、DataSetをそのままバーンと投げてます。クライアントが.NETアプリなら簡単に受け取れ、Webサービスを使うことを手間と感じるよりは、SQL部分をWebサービスとして独立させることにより、SQL文が簡単に使いまわしできるメリットの方を多く感じていたのですが、Access2003でDataSet型を受け取ろうとして四苦八苦。
現在のところ、一番らくちんそうな解決策は、Webサービスの結果を配列で受け取り、Item(1).XMLを一時的にXMLファイルに保存し、Application.ImportXMLでテーブルとしてインポートすること。
注意点は、

  1. XMLファイルを保存する際に、ユニコードではなくシフトJISになっているようなので、先頭に<?xml version='1.0' encoding='Shift_JIS'?>追加してやる
  2. 同じ名前のテーブルがあると、上書きせずに連番を追加していくので、インポート前には、古いテーブルを削除しておく
ことくらいかな。VBAはほとんど経験なく、Access2003もまだ使い始めたばかりなので、もっとうまい方法がありそうですが、とりあえず動くし(^^;)。

Item(1).XMLがNULLを含むせいで完全なマトリックスでなかったなら、Item(0).XMLをスキーマとして先にインポートし、後からItem(1).XMLのデータ部分を追加する必要あるかも。だっさー。XMLサポートを売りにしている2003だからもっとエレガントな方法が絶対にあるような気がしてきた。
あと、Item(1).XMLがどれくらいのサイズまで保持できるのか若干不安(^^;)。

投稿者 idic : 17:45 | コメント (1)

2005年09月09日

エクセル2003

エクセル2003のXML機能をテスト中。う~ん、微妙な感じ。CSVですむ作業をやらせるには非常に簡単ですが、ちょっと複雑になるとうまく対応できないみたいです。
本日始めたばかりなので、スキーマの知識不足か、あるいはエクセルの知識不足が原因かもしれませんが。
単純な縦横のデータ(テーブル)なら驚くほど簡単にやり取りできますが、同じ形式のテーブルが地域ごとに分かれて一つのシートに存在する場合、うまく取り出せません。
こういう形に取り出したい、というXMLを書き、エクセルにインポートし、XSDを自動作成してもらったところ、手書きしたXSDと似たようなものができたのですが、エクセルに張り付いたデータは、エリア名が左端にずら~と並んでいます。正規化しないAccessデータ、という感じ(^^;)。なるほどねぇ。

投稿者 idic : 12:52 | コメント (0)

2005年12月02日

エクセルからWebサービスにアクセス

参考になるページを見つけたのでメモです。
Webサービス実験場「WSDLって何?SOAPって何?UDDIって何?」
テスト用のWebサービスが公開されていて、ちゃんと動いているのがありがたいです。

投稿者 idic : 18:25 | コメント (0)

2005年12月14日

エクセルからWebサービスにアクセス その2

データセットをバーンと投げるWebサービスをエクセル側でテーブルに復元するマクロ。
VBはもちろん、VBA、エクセルマクロも初めてなので、とんでもないことをしてるかも。
結構大変でした。ReDemを知らなかったし(^^;)。
エクセルからもっと簡単にWebサービスにリンクできてもよさそうなのですが、本当にこうするしかないのかなぁ。

Sub GetDS()
'Create WebService Instance
Dim obj As New clsws_MyService
Dim itemNames As IXMLDOMNodeList '項目名
Dim dataNodes As IXMLDOMNodeList 'データ部分
Dim iName() As String
'タイトル部分書き出し
'まず、ユニークなsequenceを抜き出し。ややこいNSは無視
Set itemNames = obj.wsm_ReturnDS().Item(0).selectNodes("//*[local-name() ='sequence']").Item(0).childNodes

ReDim iName(itemNames.Length)

For i = 0 To itemNames.Length - 1
iName(i) = itemNames.Item(i).Attributes.getNamedItem("name").nodeValue
Cells(1, i + 1) = itemNames.Item(i).Attributes.getNamedItem("name").nodeValue
Next


'データ部分書き出し
Set dataNodes = obj.wsm_ReturnDS().Item(1).selectNodes("//Table")

For i = 0 To dataNodes.Length - 1
For j = 0 To itemNames.Length - 1

Dim nName As String
nName = iName(j)
Cells(i + 2, j + 1) = dataNodes.Item(i).selectSingleNode(nName).Text
Next
Next

End Sub

投稿者 idic : 19:52 | コメント (0)

2005年12月17日

Wiki

画像アップロード機能付きのWikiを調べてみた。
FreeStyle Wiki…Perlさえ動けば大丈夫。自動でPDF版もはいてくれる。
MediaWiki…PHP+MySQLが使えるならこちらかも。ウィキペディアで使われているWikiがGPLライセンスで提供されているらしい。
とりあえずメモがわり。

投稿者 idic : 12:40 | コメント (0)

2005年12月26日

MediaWiki

AxKitの入っているテストサーバにMediaWikiを入れてみました。
AxKitのインストールが楽になったのでちょっと冒険です。
無事どちらも動いたけれど、疲れました…。
portsでそのままmediawikiをインストールしたら、PHPから丸ごと入れてくれるかな、と思ったらすんなり動いてくれない。デフォルトではMySQLが有効になってないのが原因かと思ったけれど、有効にしてから再インストールしても、PHPがMySQLアウェアにならない。しょうがないからMakefileを直接いじくって--with-mysqlを追加。
ひと山越えたと思ったら今度はDBに接続できない、MySQLの1251エラー。ググるとMySQLのパスワードのセキュリティが高くなったにもかかわらず、PHPから接続する場合このパスワードが理解できないらしいのが原因らしい。XOOPSでMySQLのバージョンあげると同じことが起こるので、いつかは通る道だったらしい。MySQLの起動シェルスクリプトにオールドタイプのパスワードに対応するオプションを追加し、mediawiki用のパスワードを旧タイプのパスワードに更新。詳しくはMySQLと1251ググること。

投稿者 idic : 23:26 | コメント (0)

2005年12月30日

MediaWikiその2

寒い日が続いておりましたが、今日はいい大掃除日和でした。
そんなことはどうでもいいんですが、MediaWikiをインストールしたものの、使い方が良くわからずドキュメントを漁っている間に、MediaWiki FAQに日本語版がないことに気づき、勢いで日本語ページを作ってしまいました。
とりあえず英語版をベトッと貼り付け、タイトルから訳し始めたものの、早くも挫折の予感。
今年は短いお正月休みで、タイトルだけでも無理っぽい。誰か助けてください(^^;)。

投稿者 idic : 21:03 | コメント (0)

2006年01月02日

MediaWikiその3

明けましておめでとうございます。今年もどうぞよろしくお願いいたします。
MediaWiki、難しい。メタって何よ?歓迎メッセージもらったけれどどうやって返事すればいいの?状態です。ちょっと準備不足で飛び込んでしまった感じ(^^;)。
現在、目次(Table of Contents)が一部欠けしまう現象が出て、MLサポート受けているところ。どうやら個人的な環境のせいで、他の人からは正常に見えているらしい。親切な方が、私の日本語の投稿を英語に訳してより適切なMLに投げてくださるそう(ほんとうにすみません)。
思い返せば、PerlでCGIを始めた時も、AxKitを始めた時も、散々ネットコミュニティの親切な方々のお世話になってきものだなと。今回もしばらくいろんな方にご迷惑をおかけしそうですが、そのうち何らかの形で貢献したいものです。

投稿者 idic : 15:49 | コメント (0)

2006年01月21日

ASP.NETでモバイル用Webアプリ挫折しました

結局外側をUNIX系に変え、SOAP::Liteで中のWebサービスとやり取りすることにになりました(^^;)。
時間があれば、じっくり勉強できるんでしょうが調べているより早いわ、ってことで。
ところが実は自分が書いたWebサービス以外とSOAP::Liteで通信するのは初めてだったんですよね。
パラメータが送られてない、と文句を言われスペルを確認しても間違いなしでしばらく悩んだ結果はネームスペースの最後のスラッシュのあるなし。
ネームスペース修正したら、intやdateTimeがあるため、タイプが違うといわれ、タイププロパティを指定したら、dateTimeがスキーマに無い、と言われ、確認したらスキーマのバージョンが違う(^^;)。
ググッてこちらのソースを参考に
->xmlschema('http://www.w3.org/2001/XMLSchema') を追加したら動きました。
携帯用? デザインいらないし.NETに専用ツールあるみたいだし1日あれば余裕でしょ、うまくいけば半日ですむかも、で受けた仕事なのに正味3日がかりでした。まいった、まいった。

投稿者 idic : 10:17 | コメント (0)

2006年01月22日

MediaWikiその4

MediaWikiで目次(TOC)の一部が欠ける現象が解決しました。既に「バグの報告」にあるのを、親切な日本語ネイティブでない方に探し出していただきました。しかもMLに流してもらった情報に日本語の件名がついてなかったばかりに見落とし、個別にメールまでいただいて、おはずかしいしだい(^^;)。
原因はノートンの広告ブロックでした。インターネットセキュリティはオフにして試したのですが、広告ブロックはアンチスパムの方だったため、気づかなかったのでした。

投稿者 idic : 17:18 | コメント (0)

2006年03月29日

PXDOCの印刷で文章の一部が欠ける

ASP.NETから作成しているPXDOC文章の中の「拝啓、時下ますますご清栄のこととお喜び申し上げます。」という文章の「拝啓、時下ますますご清栄のこと」以降が印刷されない。画面にはきれいに表示されているのに。ファイルを保存して印刷しても駄目。文字コードをUTF-8からShift_JISに変更してもだめ。切れている部分にああああああを補うと印刷してくれる。「お喜び」を「およろこび」に変えても印刷してくれる。ひらがなでいっとく(^^;)?と冗談も言ったのですが、自由入力欄に入れた文字によっては印刷されないこともあるので却下。
原因は使用しているプリンタのドライバでした。NEC MultiWriter2350Nを使っているのですが、たまたま2300のドライバを入れて使っている人がいて、それだと問題なく印刷される。印刷されなかったPCのドライバを2300に落とすと印刷される。NECのサイトから落とした最新版のNEC MultiWriter2350用ドライバでも印刷できました。あまりにも不思議な現象に一時はどうなることかと思いました。
まあ、こんあこともあるということで。

投稿者 idic : 21:45 | コメント (0)

2006年04月23日

XMLってやっぱり便利だわ

別のサーバにある、「個人情報の取り扱いについて」XMLファイルを参照しながら、ふと思ったこと。
昔、CGIを始めたころ、別のサーバにあるファイルでも簡単にopen,closeできるものと思い込み方法をMLに投稿したら、wgetとかLWPとか汎用サーバでは使いない方法が返ってきたことを思い出しました。
URL指定するだけでopen,closeさえすることなく簡単に取り込めるのは結構すごいことなんじゃないでしょうか。

投稿者 idic : 11:55 | コメント (0)

2006年05月20日

XMLってやっぱり便利だわ2

テーブルを定義するのって面倒。特にキャンペーンの応募フォーム等、一定期間しか使わない場合など。項目名が5くらいがやる気の限度。10を超えるとアレルギー反応が出てしまいます(^^;)。
自分で作成、変更可能な場合ならまだしも、人にお願いして作成してもらう必要がある場合など、テーブル作成用SQL文を渡すまでぐじぐじと時間を取ってしまいます。
そんなもんで最近、一定期間のみ受付、と言う場合はどーんとでっかいテキストフィールドを作り、クエリストリングと同じ形で保存! URLエンコードされているので、データベースの文字コードも気にする必要なし。後でゆっくりクエリストリングを分解して連想配列に落とす時のルーチンを使い<フォーム名>値</フォーム名>という形で書き出し、それをレコードごとにタグでくくり、さらに全体をルートタグでくくってと。CSVと違ってチェックボックスなど値がとぶものとばないものが混じっても大丈夫。

投稿者 idic : 12:11 | コメント (0)

2006年11月06日

mediawiki2HTML

mediawikiのデータをHTML等別のフォーマットに変換して出力したい、という場合の方法を調べてみました。
本家の一覧はhttp://meta.wikimedia.org/wiki/Alternative_parsers
個人的には、CPANで見つけたText::MediawikiFormatが使いやすかったです。てか今使い始めたところですが。

投稿者 idic : 12:38 | コメント (0)

2007年04月17日

XMLでサーバー間のやり取り

.NETを使っているとWebサービスがどーんとあって、UNIX系のサーバに入ってコマンド叩いて返ってくる値を受け取るのにSOAPしか思いつかずAxisやSOAP::Lite調べたりし始めたのですが、Apache+CGIが動いているのなら何もSOAPでやる必要あるのか?普通にCGIでHTMLの代わりにXML返してやればいいんじゃないか?ってことでやってみたら簡単に動きました。
CGI側ではヘッダをにして
print "Content-type: text/xml\n\n";
.NET側では
using System.Xml
でLoadするファイル名をCGIに渡すパラメータ付きで指定するだけ。
たいそうにエンベロープでくるむほどの情報でもないしね手軽なのがいいですね。

投稿者 idic : 23:13 | コメント (0)

2007年04月29日

エクセルからWebサービスにアクセス その3

err1.gif
初画像アップです(^^;)。
その2を書いたのは1年以上前(!)ですがいざ使おうとしたらこんなエラーが出ます。SQL Serverからせレクトした結果をDataSetのままWebサービスに渡しているわけですが、SELECTする項目に「営業備考」が含まれているとこのエラーになります。SELECT時にASで別名に置き換えていても同じ。登録されているデータのせいかも知れませんが(他の項目に比べ入力されている量が多いし)、エラーの出るタイミングはヘッダの書き出し部分。
今回はエクセル側では必要のない項目だったので、読み飛ばして続行。わざわざ取り上げたのは、実際に使おうとしたらその2で書いたサンプルに色々不具合あるということで。少なくとも定義したオブジェクトを解放しておいた方がよいかも(^^;)です。
しかも20以上の項目を800件ほどエクセルに貼り付けようとしたら結構時間がかかり、とても依頼人には見せられない(^^;)。データ呼ぶ目的は、エクセルで作成された帳票の出力なので、出力に必要なレコードだけ呼ぶようにしようと現在慣れないエクセルで検索用フォーム作成中です。

投稿者 idic : 10:33 | コメント (0)

2007年05月29日

エクセルからWebサービスにアクセス その4

今回はあまり参考にならない特殊な事例です(^^;)。
エクセルに検索フォームを設置しリリースしたところ、郵便番号での検索は問題ないけれど日本語が含まれている項目で検索すると「データが見つかりませんでした」が表示されることがある、というお返事が返ってきました。当然文字コードの問題だと思い込み、エクセルから送信された検索キーワードをそのまま返すWebサービスを作成しテストしても見た目は全く変わらず。Webサービス側で埋め込んだキーワードと並べて返してもどちらもきれいに表示されるしで、元のファイルの戻りデバッグモードで動かしたら、なんとちゃんと1件返信されておりました。ただ判別で> 1で「データが見つかりませんでした」となっていただけ(^^;)。郵便番号検索だと1件に絞り込まれることはなく正常に表示。ビル名等データが1件に絞り込まれてしまうようなキーワードを入れると表示されていないのでした…。まあ、心配せずに日本語でのやりとりも問題なく出来ますよ、という情報です。

投稿者 idic : 11:09 | コメント (0)