いちばん失敗した人決定戦

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件)

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>
$
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。

SelectNodes("A1|B1")でList作成して
for文で回しタグ名確認しながら情報取り出そうと思ったのですが、
>preceding-sibling::A1[position()=1]/A2/text()
今回のケースに合うか調べてみます。

サンプルありがとうございます。
自分も激しく同意です・・・

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

お礼日時:2012/07/03 11:02

XPath を使えば指定できそうだけど, 「構造を考え直すべし」という #2 の指摘には同意.

    • good
    • 0
この回答へのお礼

御回答ありがとうございます!!

その方が自分も嬉しいです・・・
ってか、自分もそう作成します。
自分も同意します(笑)

御回答ありがとうございましたm(_ _)m

お礼日時:2012/07/03 10:54

>タグ名は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>
の方が簡単になると思いますが。
    • good
    • 0
この回答へのお礼

御回答ありがとうございます!!

その方が自分も嬉しいです・・・
ってか、自分もそう作成します。
あくまで自分が今やっているのは
解析部分だけですので、
そういうものだと思って解析かけています。

とりあえず、あまり好きではないのですが、
最初考えていたSelectNodes("A1|B1")にして
中身解析かけてみようと思います。

何度もありがとうございましたm(_ _)m

お礼日時:2012/07/03 10:52

どの言語の何で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の情報かわからないと思いました。

すいません、まだ頭の中でしか考えてないので、
完全な勘違いなら本当にすいません・・・

補足日時:2012/07/02 22:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!