XMLの解析を行いたいのですが、
ちょっと困っています。
最初はSelectNodesメソッドを利用し
複数情報を取り出そうと考えていたのですが、
下記の様な場合に対応出来なくなってしまいました。
<A1>
<A2><A2>
</A1>
<B1>
<B2></B2>
<B2></B2>
<B2></B2>
<B2></B2>
</B1>
<A1>
<A2><A2>
</A1>
<B1>
<B2></B2>
<B2></B2>
<B2></B2>
<B2></B2>
</B1>
A1とB1がセットにて2件の情報が返ってきているのですが、
同じタグ名な為、
SelectNodes("B1")で取り出した際に、
どれが1個目のA1の情報で
どれが2個目のA1の情報か判断付きませんでした。
(*B1の数は常に変動します)
何かうまい方法ないでしょうか。
詳しい方いましたらどうぞよろしくお願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
B2 の直前の A1 の子要素 A2 のテキストを取得
preceding-sibling::A1[position()=1]/A2/text()
でも、
[ANo.3]>『「構造を考え直すべし」という #2 の指摘には同意.』
には同意。
■ 確認
[q7568320.xml]
<?xml version="1.0" encoding="UTF-8" ?>
<!--?xml-stylesheet type="text/xsl" href="q7568320.xsl"?-->
<root>
<A1><A2>1</A2></A1>
<B1><B2/><B2/><B2/><B2/></B1>
<B1><B2/><B2/><B2/><B2/></B1>
<B1><B2/><B2/><B2/><B2/></B1>
<B1><B2/><B2/><B2/><B2/></B1>
<A1><A2>2</A2></A1>
<B1><B2/><B2/><B2/><B2/></B1>
<B1><B2/><B2/><B2/><B2/></B1>
<B1><B2/><B2/><B2/><B2/></B1>
</root>
[q7568320.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="xml" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:apply-templates select="root" />
</xsl:template>
<xsl:template match="root">
<result>
<xsl:apply-templates />
</result>
</xsl:template>
<xsl:template match="A1" />
<xsl:template match="B1">
<xsl:copy>
<xsl:attribute name="A2">
<xsl:value-of select="preceding-sibling::A1[position()=1]/A2/text()" />
</xsl:attribute>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:copy />
</xsl:template>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
■ 結果
$ xsltproc q7568320.xsl q7568320.xml
<?xml version="1.0" encoding="UTF-8"?>
<result>
<B1 A2="1"><B2/><B2/><B2/><B2/></B1>
<B1 A2="1"><B2/><B2/><B2/><B2/></B1>
<B1 A2="1"><B2/><B2/><B2/><B2/></B1>
<B1 A2="1"><B2/><B2/><B2/><B2/></B1>
<B1 A2="2"><B2/><B2/><B2/><B2/></B1>
<B1 A2="2"><B2/><B2/><B2/><B2/></B1>
<B1 A2="2"><B2/><B2/><B2/><B2/></B1>
</result>
$
御回答ありがとうございます。
SelectNodes("A1|B1")でList作成して
for文で回しタグ名確認しながら情報取り出そうと思ったのですが、
>preceding-sibling::A1[position()=1]/A2/text()
今回のケースに合うか調べてみます。
サンプルありがとうございます。
自分も激しく同意です・・・
ありがとうございました。
No.3
- 回答日時:
XPath を使えば指定できそうだけど, 「構造を考え直すべし」という #2 の指摘には同意.
御回答ありがとうございます!!
その方が自分も嬉しいです・・・
ってか、自分もそう作成します。
自分も同意します(笑)
御回答ありがとうございましたm(_ _)m
No.2
- 回答日時:
>タグ名はA1とB1の2つのグループしかないのですが、
>グループの構成が異なります。
(以下略)
やりたいことはわかりましたけど、どちらかといえばxmlの構造が不適切な気がします。
もしやるとするならSelectNodes("A1")で取得したノードの後ろにB1ノードがいくつ続くかで判定することになるのではないでしょうか。
xmlの構造を変更してよいのでしたら
<Group>
<A1><A2/></A1>
<B1><B2/><B2/><B2/><B2/></B1>
<B1><B2/><B2/><B2/><B2/></B1>
<B1><B2/><B2/><B2/><B2/></B1>
<B1><B2/><B2/><B2/><B2/></B1>
</Group>
<Group>
<A1><A2/></A1>
<B1><B2/><B2/><B2/><B2/></B1>
<B1><B2/><B2/><B2/><B2/></B1>
<B1><B2/><B2/><B2/><B2/></B1>
</Group>
の方が簡単になると思いますが。
御回答ありがとうございます!!
その方が自分も嬉しいです・・・
ってか、自分もそう作成します。
あくまで自分が今やっているのは
解析部分だけですので、
そういうものだと思って解析かけています。
とりあえず、あまり好きではないのですが、
最初考えていたSelectNodes("A1|B1")にして
中身解析かけてみようと思います。
何度もありがとうございましたm(_ _)m
No.1
- 回答日時:
どの言語の何でxmlを解析しようとしてるのか書きませんか。
ご自分だけが理解できる質問文を書かれても回答できる人はなかなかいないはずです。
>A1とB1がセットにて2件の情報が返ってきているのですが、
>同じタグ名な為、
>SelectNodes("B1")で取り出した際に、
>どれが1個目のA1の情報で
>どれが2個目のA1の情報か判断付きませんでした。
>(*B1の数は常に変動します)
SelectNodes("B1")で取り出したノードはB1ノードのわけですから、1個目のA1とか2個目のA2があるわけないんですが・・・
取り出したB1ノードの前にあるA1ノード、後ろにあるA1ノードなら取得できると思いますけど。
この回答への補足
すいません、書き忘れてました・・・
C# VS2005です。
>SelectNodes("B1")で取り出したノードはB1ノードのわけですから、1個目のA1とか2個目のA2がある>わけないんですが・・・
>取り出したB1ノードの前にあるA1ノード、後ろにあるA1ノードなら取得できると思いますけど。
タグ名はA1とB1の2つのグループしかないのですが、
グループの構成が異なります。
例
1個目、A1 1つに対してB1が4つ紐づく
2個目 A1 1つに対してB1が3つ紐づく
SelectNodes("B1")で7つの情報が引き出せるが、
1個目のA1か2個目のA2の情報かわからないと思いました。
すいません、まだ頭の中でしか考えてないので、
完全な勘違いなら本当にすいません・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 統計学 個別の期待値は小さいけど集計すると期待値は大きくなる場合とは? 4 2022/06/14 08:27
- Excel(エクセル) Google Spreadsheetのカスタム表示形式について 2 2023/05/20 09:10
- Excel(エクセル) エクセルの計算で 4 2022/12/13 16:49
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
- Excel(エクセル) 至急です><Excelの関数を教えてください。 2 2022/03/22 17:56
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 3 2023/02/28 01:13
- Excel(エクセル) EXCEL 行内のデータを2行に分けて、表を作り直したいのです。教えてください。 5 2023/06/25 14:00
- 数学 高校物理 相対速度の式について 5 2022/05/11 00:14
- 飲み物・水・お茶 え!これ100%、ならば買おうかな。…しかし実際は… 10 2022/09/06 20:37
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 1 2023/02/27 22:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XSLで、XMLの空タグを制御したい。
-
ノードの並び替え
-
タグの有無の判定
-
xslでの最小値、最大値の取得
-
xmlのテキストにリンクを張りた...
-
XMLのHTMLへの変換 (初心者)
-
CPUの考え方を教えてください ...
-
XMLで要素が記述された順番に意...
-
バッチファイルでテキストファ...
-
昔Winnyってありましたけど、あ...
-
あせんうぶり言語
-
VB6でXMLを作成しているのです...
-
SNMP リンクダウンとノードダ...
-
あるノードリストに、特定の名...
-
HTTPステータス 404 - There is...
-
コンテキストメニュークリック...
-
Listからのnull要素を削除方法は?
-
ルート要素ノードが2個ある場合?
-
ノードとは
-
このエラー、何とかなりません...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XSLで、XMLの空タグを制御したい。
-
タグの有無の判定
-
XSLでXMLデータをタブ区切りデ...
-
XSLTで固定長データファイルを...
-
XSL中の改行、タブを無効にした...
-
xmlのテキストにリンクを張りた...
-
重複するものを消したい
-
XSLTがブラウザで表示されません。
-
うまく表示されない
-
文字列の取得
-
xsl:param要素をxsl:templateの...
-
value-ofの値を属性値とするには
-
XMLをXSLを使いHTMLに変換した...
-
XMLから指定テキストのみを抜き...
-
ある文字列を含むノードが存在...
-
VBAからxml・スタイルシートを...
-
xsl、xpath式の書き方について
-
XSLで特定のタグだけを出力する...
-
XSL内でJavaScriptを記述し、Ja...
-
XSLTで直下のテキストのみ取得...
おすすめ情報