ぽざうねっと

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  420  : 記事  0  : コメント  9488  : トラックバック  76

ニュース

さて、今年は何を漬けようか

書庫

日記カテゴリ

Accessory

Community

Private

http://bbs.wankuma.com/index.cgi?mode=al2&namber=575

ネタ元は上記のわんくま BBS です。
DataTable の行と列を入れ替えるのをわざわざ XSLT を利用してやってやろうという試み。
DataTable::WriteXml で出力した XML に XSLT をかませて変換し、変換後の XML を食わせて DataTable を作ってやる。
ちなみに、DataTable に名前が設定してなければ WriteXml ができないのでご注意。
なので、DataTable ではなく DataSet (Tables[0] に 対象の DataTable を持つ)を対象とする。
DataSet::WriteXml と DataTable::WriteXml で出力される XML に大きな違いはない。
(Tables.Count == 1 であれば)ルート要素の要素名が DataSet の名前になるか、DocumentElement 固定になるかの違いだけである。
DataTable より DataSet を使ったほうがいい理由は、XmlDataDocument が利用しやすいからである。
XmlDataDocument は作成時に DataSet を引数に取れる。
また XmlDataDocument は XmlDocument を継承しており、IXPathNavigatable を実装しているので XSLT 変換が容易にできる。

前置きはここまでにして、使用する XSLT は以下のものである。
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:apply-templates mode="root"/>
    </xsl:template>
    
    <xsl:template match="*" mode="root">
        <NewDataSet>
            <xsl:apply-templates mode="controlRowRender"/>
        </NewDataSet>
    </xsl:template>
    
    <xsl:template match="*" mode="controlRowRender">
        <xsl:if test="position() = 1">
            <xsl:apply-templates mode="renderRow"/>
        </xsl:if>
    </xsl:template>
    
    <xsl:template match="*" mode="renderRow">
        <xsl:variable name="name" select="name(.)"/>
        <NewDataTable>
            <xsl:for-each select="../..//*[name(.) = $name]">
                <xsl:element name="{concat('col', position())}">
                    <xsl:value-of select="."/>
                </xsl:element>
            </xsl:for-each>
        </NewDataTable>
    </xsl:template>
</xsl:stylesheet>
列名もテーブル名も全くもってわからないので、このように汎用的にする必要がある。
逆に言えば、どんな DataTable もこの XSLT 一つで行と列を入れ替えることができる。
ポイントは、match を * にしておいて、mode 指定によって切り替えるということ。
要素名はわからないけれども、構成・階層が固定になるから使えるテクニックだ。
で、この XSLT で変換した結果の XML を DataSet に食わせて、Tables[0] を取得すれば、行と列が入れ替わった DataTable が取得できる。

はっきり言ってこんなものを使ってまで、行と列を入れ替える必要がない。
簡単な二重ループで事足りる。
しかしこれは、少し変えれば限定状況ながらも有効に利用できる。
もともとの用途では、GridView にバインドすることが想定されていた。
ここで、バインド後に GridView 固有の機能(イベントやら何やら)を使用しないという状況を考える。
そんな場合、Xml コントロールを使用し、先述した XmlDataDocument を使用し、下記のような XSLT を使用する。
要素名をテーブルに対応させただけのものである。
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:apply-templates mode="root"/>
    </xsl:template>
    
    <xsl:template match="*" mode="root">
        <table border="0" cellpadding="0" cellspacing="1">
            <xsl:apply-templates mode="controlRowRender"/>
        </table>
    </xsl:template>
    
    <xsl:template match="*" mode="controlRowRender">
        <xsl:if test="position() = 1">
            <xsl:apply-templates mode="renderRow"/>
        </xsl:if>
    </xsl:template>
    
    <xsl:template match="*" mode="renderRow">
        <xsl:variable name="name" select="name(.)"/>
        <tr>
            <xsl:for-each select="../..//*[name(.) = $name]">
                <td>
                    <xsl:value-of select="."/>
                </td>
            </xsl:for-each>
        </tr>
    </xsl:template>
</xsl:stylesheet>
すると、DataTable には何の操作も行わずに、行と列を入れ替えたテーブルを表示することができる。
「表示だけ」という限定された状況なれど、利用する価値はあるのではなかろうか。
投稿日時 : 2007年2月1日 0:10

コメント

# re: XSLT を用いて DataTable の行と列を入れ替える 2007/02/01 16:56 刈歩 菜良
すご~い!!
すんばらしい!!
やっぱ、XMLがらみも勉強せないかんですなぁ。

# いまだに、VSさんにおんぶにだっこなわたくし...

ありがとうございました。

# re: XSLT を用いて DataTable の行と列を入れ替える 2007/02/02 1:26 THREE-ONE
XML はもはやそこら中にころがってますからねー。
XSLT が使えると何かと便利です。

# cartier love bracelet used replica 2015/07/15 13:09 bmgtjxxzphd@aol.com
That cake is insanely beautiful! Wow!
cartier love bracelet used replica http://www.lovejewelrymen.com/

# chanel Kopie tasche 2015/09/09 15:44 luzfyvir@aol.com
1/GScraper-Split-7 to GScraper-Split-9
chanel Kopie tasche http://www.replicasbag.net/de/-c87/

# gioielli cartier falso 2015/09/16 22:10 wnckzk@aol.com
“In the winter I act in a very group at Allen’s Lane Theater Company, in Philadelphia. Hans also acts there. He’s within our group at Allen’s Lane. Buyers by mistreatment a bouncing commendation appraisal will just in 24 were created repbeast conformity in be refunded inside once unit. There are amount of grouping who’re same for everybody and an imperative call of greenbacks may come into anybodys life with no preceding telling. These loans are apace provided when you require cash travel from
gioielli cartier falso http://www.replicacartierbracelet.ru/it/replica-cartier-love-bracelet-c139/

# フランク ミュラーコピー 2017/07/11 18:56 gevdytsy@outlook.com
弊店では信用第一主義を徹底しており社員全員下記の方針のもとに頑張っています。
1.不適合品を入荷しない。
厳しく受け入れ検査を行い、お客様に満足いただける品質のいい物だけを入荷する。
2.不適合品を出荷しない。
出荷前に細部まで二重確認を行い、お客様からご注文頂いた商品を納期通り出荷する。
3.お客様からのクレームゼロ
お客様第一主義を徹底し、お客様からのお問い合わせ、苦情等に対して積極的かつ丁寧に対応いたします。
フランク ミュラーコピー http://www.gooshop001.com

# ブランド通販店 2019/09/17 6:11 Georgefipse
弊社は各ランクのブランド商品満載し、ブランド通販店で一番信用のある店なので!。
品質はこちらが間違いなく保証します。
https://www.ginzaoff.com

■取扱ブランド ロレックス時計コピー、カルティエ時計コピー、IWC時計コピー、
ブライトリング時計コピー、パネライ時計コピー.
◆ スタイルが多い、品質がよい、価格が低い、実物写真!
◆ ご入金頂いてから最速4日、遅くとも7日程度でご指定場所へ発送出来る予定でございます
◆ 商品送料を無料にいたします

◆信用第一、良い品質、低価格は 私達の勝ち残りの切り札です。
◆ 当社の商品は絶対の自信が御座います。
◇ N品質 シリアル付きも有り 付属品完備!

◆ 必ずご満足頂ける品質の商品のみ販売しております。
◇ 品質を最大限本物と同等とする為に相応の材質にて製作している為です。
◆ 絶対に満足して頂ける品のみ皆様にお届け致します。

興味あれば、是非一度サイトをご覧になって下さい。
今後ともよろしくご愛顧くださいますよう、お願い申し上げます
https://www.ginzaoff.com
お取り引きを開始させていただきたく思います。
詳細に関してはどうぞお気軽にご連絡ください。

# doxycycline order online https://doxycyline1st.com/
price of doxycycline 2022/02/26 8:24 Jusidkid
doxycycline order online https://doxycyline1st.com/
price of doxycycline

# ed meds online canada: https://medrxfast.com/ 2022/08/07 8:49 MedsRxFast
ed meds online canada: https://medrxfast.com/

# best treatment for ed https://ed-pills.xyz/
best male ed pills 2022/09/16 14:51 EdPills
best treatment for ed https://ed-pills.xyz/
best male ed pills

# cheap erectile dysfunction pill https://ed-pills.xyz/
best non prescription ed pills 2022/09/17 15:01 EdPills
cheap erectile dysfunction pill https://ed-pills.xyz/
best non prescription ed pills

# Read here. Everything what you want to know about pills.
https://edonlinefast.com
Read now. Get here. 2023/02/18 16:58 EdOnline
Read here. Everything what you want to know about pills.
https://edonlinefast.com
Read now. Get here.

# treatment for ed https://edpill.pro/# - ed treatment review 2023/06/27 16:03 EdPills
treatment for ed https://edpill.pro/# - ed treatment review

# buy cytotec in usa https://cytotec.ink/# - buy cytotec in usa 2023/07/26 20:30 PillsFree
buy cytotec in usa https://cytotec.ink/# - buy cytotec in usa

# paxlovid generic https://paxlovid.bid/ paxlovid buy 2023/10/26 0:37 Paxlovid
paxlovid generic https://paxlovid.bid/ paxlovid buy

# doxycycline 100mg https://doxycycline.forum/ how to buy doxycycline online 2023/11/25 14:40 Doxycycline
doxycycline 100mg https://doxycycline.forum/ how to buy doxycycline online

# farmacie online autorizzate elenco https://farmaciait.pro/ farmacie online autorizzate elenco 2023/12/04 11:17 Farmacia
farmacie online autorizzate elenco https://farmaciait.pro/ farmacie online autorizzate elenco

# ed drug prices https://edpills.tech/# ed remedies 2023/12/23 9:32 EdPills
ed drug prices https://edpills.tech/# ed remedies

Post Feedback

タイトル
名前
Url:
コメント: