- PR -

複数のXMLをひとつにする

投稿者投稿内容
itsu
会議室デビュー日: 2002/04/24
投稿数: 5
投稿日時: 2003-04-01 11:01
複数のXMLをXSLTを用いてひとつにするということは
可能なのでしょうか?
いろいろ探してみたのですがうまく見つからなくて。

できないってことですかね。
itsu
会議室デビュー日: 2002/04/24
投稿数: 5
投稿日時: 2003-04-01 11:37
自己レスです。
<xsl:copy-of select="document('test1.xml')"/>
<xsl:copy-of select="document('test2.xml')"/>
<xsl:copy-of select="document('test3.xml')"/>
でできることがわかりました。
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-04-04 11:45
ども、ほむらです。
便乗で僕からも質問させてください。。
僕の場合は、出来ないのでなくスマートなやり方がないかなという
程度なのですが・・・・・
------------------
内容は、XMLノードの補完について?です
実際には微妙に違いますが・・・
コード:
<xsl:template match="/command/schedule"><!-- default.xmlのもの -->
  <xsl:variable name="uid" select="./@id" />
  <xsl:variable name="schedule" 
    select="document('./data.xml')/command/schedule[@id=$uid]|."/>


としていて後は、使うときに
コード:
<xsl:value-of select="$schedule[1]/shell/text()" />


見たいな形にしています。
僕の予定としてはdata.xmlデータがあればノード数は2個になって
順序は1.data.xml 2.default.xml
なければノードは1個になって 1.default.xml のみ
のつもりです。。。

始めの小さいうち(実験段階)はよかったのですが
オーバーライドもしてしまおうと考えたら
莫大に大きくなってしまって。。。。見難くなってしまいました。
コード:
<xsl:value-of select="$schedule[1]/shell/text()" />
を
<xsl:value-of select="$schedule/shell/text()" />


と書けるようになるよい方法はありませんか?
一言で表すと2つの重複するノードを優先順位をつけて
一つにまとめたいということです^^;;;;
そんな無茶な機能はやっぱりないでしょうか・・・・・
----------------------------------------

---- default.xml ----
コード:
<command>
  <schedule enable="true" id="1000">
    <date month="04" day="1,2,4-18" hour="15" min="00" week="*" />
    <shell log="filename" write="new"><![CDATA[/usr/local/script/mirror.sh ]]></shell>
  </schedule>
  <schedule enable="true" id="1010">
    <date />
    <shell log=""><![CDATA[ ]]></shell>
  </schedule>
  <schedule enable="true" id="1020">
    <date />
    <shell log=""><![CDATA[ ]]></shell>
  </schedule>
</command>



---- data.xml ----
コード:
<command>
  <schedule enable="true" id="2000">
    <date month="04" day="30" hour="23" min="00" week="*" />
    <shell log="filename" write="append"><![CDATA[/usr/local/script/backup.sh ]]></shell>
  </schedule>
</command>


@id ******* 各schedule固有の識別キー
@enable *** true以外のときはコメント行として出力
@override * trueのとき重複するノードは変更・しない場合は追加(ノード補完)
*********** true以外のとき 上書き
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2003-04-04 16:11
XML の(2本マージのシーケンシャル)更新のような雰囲気
SORTしてあるならSAXのほうがデータ量的にはいいけど
XMLをDBに投げ込んでSQLとかも簡単なのでは、なぜXSLT
(XMLupdate とかは XQuery で検討中)

<xsl:for-each select="(document('data.xml')|document('default.xml'))/command/schedule">
<xsl:sort select="@id"/>
<xsl:copy-of select="."/><!-- とりあえず混ざります -->

まとめは 重複(どの範囲まで考えるか)削除などの例を参考に書きます。
http://qa.xml.gr.jp/data/xsl/files/0026.xml
1段より2段XSLTのほうがわかりやすいとおもいます、
(XMLパイプライン処理)

現XSLT機能では人々を混乱させるソースになるかもしれません。
検索すると XMLのUPDATEをするXSLTソースは発見できるかも
(ヒント:再帰処理、XPath軸)

[ メッセージ編集済み 編集者: MMX 編集日時 2003-04-11 10:55 ]
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-04-11 15:03
ども、ほむらです。
色々と調べていたら遅くなってしまいました。
もうわけありません。(気が付けば一週間もたっているんですね^^;;;;
----------
DBを使用しないのはすべての処理をクライアント単体で
できるようにするためです。
(本格的に使っているのはホームページなんです)

XQuery。。かなり便利そうな予感です。実装されるのが待ちどうしいです。
XSLT2.0も一緒に実装されると思うし・・・

今のところはSQLで言うところの単純なSELECT文程度のことは
できるみたいですね。>XQuery
# 本音を言うとどうせなら普通にSQLを拡張した形にしてほしかったなぁ。。。
# などと思ってしまいます。(SQL+XPathとか)

UPDATE処理に関することは見つけられませんでした^^;;;;;

重複したノードを削除するサンプル試してみたのですがどうやら
同じドキュメント内になければ動作してくれないみたいです。
XPathの仕様のせいでしょうか。。。
やっぱり、フィルタを使用してちまちまとやるしかないみたいですね。

ところで、<xsl:copy-of select=""/> でノードが混ざると言う話なのですが
ここで混ざったデータを展開するにはどうすればいいのでしょうか?
エイリアスを使用してあげればよいんですか?
いろいろ方法を考えてみたのですが、結局わかりませんでした;;;
そもそも、copyとかcopy-of はHTMLのpreと同じ程度にしか
思っていなかったもので・・・・・


[ メッセージ編集済み 編集者: ほむら 編集日時 2003-04-11 15:23 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2003-04-14 11:09
データをこねるにはXSLTのみでは適していないと(みなさん)言います
やりますか?{XSL有害論がぶりかえすかも}

<xsl:variable name="temp1"><tmp>
で <xsl:for-each を囲むと「リザルトセット」を変数に収容できます
この変数を再帰処理でキザんで頭から処理します。
COBOLの磁気テープのデータ処理と同じ【発想】の操作ができます。

JavaScriptとの合せ技とか、DOM+XPath とか、クライアント処理の
【発想】はいろいろあります。
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-04-14 17:34
ども。ほむらです。。
-------
引用:
データをこねるにはXSLTのみでは適していないと(みなさん)言います
やりますか?{XSL有害論がぶりかえすかも}


まぁ、僕としてはただの雛型程度にしか認識していないので
データをこねる分野で苦手なのは仕方ないかななんて思っています。
XSL有害論てどんなものなのでしょうか・・・
ちょっと検索してみたのですけどでてきませんでした。(単語だけのページはありましたが・・)
よかったら、別スレとかで概要とかリンク教えてもらえると勉強になります^^;;;;

引用:
JavaScriptとの合せ技とか、DOM+XPath とか、クライアント処理の
【発想】はいろいろあります。


DOMは一応試みてみたんです。ちょっとノードセットがうまく作れなくて
挫折してしまったのですが。。。
これを機にもう一度挑戦してみようかなと思っています。

#(BBコード 編集ついでに追加)
# でも、よく考えたらノードを走査させる場合ならSAXのほうが
# 適しているんですね。内容を読んだだけですが。。。


[ メッセージ編集済み 編集者: ほむら 編集日時 2003-04-16 10:06 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2003-04-15 10:25
http://www.xml.com の記事で1,2本の記憶しかありません
XSL有害論:XSLT初期の新規言語に対する、ある人々の評価です。

▲XSLTは簡易な構造操作を目的に設計された、が、買いかぶられて
深いデータ処理を書く人々も現れた、
再帰やmodeや多量のtemplateや長大なXPath式を駆使して。
パターンマッチ、再帰や関数型言語でくすぶっていた人々が
ここぞとばかり熟練の技でXSLTを書いたりした。(恐れ入ります)
それに対する反発は強かった、
既存の言語とAPIでも書けるじゃないか、とかXSLTの行数の水膨れ感で
書きにくいとか、パターンマッチ駆動は馴染めないとか、
食わず嫌いの論も多かった(アメリカでも日本でも)。

さて、XSLTでUPDATE を書き上げたとしても、エラー処理とか
様々な機能はどうするかとか、問題はつきないです。
「本当は(リッチクライアント)のメモリDBを要求」
なのだから。XSLTをいじめるのもいいが

「そう言っても、最近大ヒットした言語です」
次の言語はXQuaryでしょう。XSLTの経験があるので仕上がりを期待してます。

--------- 後日の追加 ------
Web-based XML Editing with W3C XML Schema and XSLT
http://www.xml.com/lpt/a/2003/04/30/editing.html
これを、読んでも更新はservletで行って XSLT ではありません。
直接XMLのデータ操作といるより、メッセージ表現形はXMLという感じです。
---------- さらに追加 ----------
The Document is the Database
http://www.xml.com/lpt/a/2003/07/09/udell.html
Webサーバーのスクリプトが主役ですが、XML の柔軟性の特徴が出ている
かも。スッキリとは見えないが。メモリDBのLIBとどちらが使いやすいか?



[ メッセージ編集済み 編集者: MMX 編集日時 2003-07-15 11:52 ]

スキルアップ/キャリアアップ(JOB@IT)