新しく質問する

XSLTを使用したXML->XML変換で...

役に立った:7件
  • 質問者:KING331
  • 投稿日時:2005/01/22 21:30
  • 困り度:すぐに回答が欲しいです
  • 友達に紹介
  • ブログに書く
  • 教えて!gooお気に入り

XSLTを使用したXMLからXMLへの変換で、やり方が分からないのでどなたかお教え願います。

以下にXMLを記述します。

----[入力側]-----
<INPUT>
<IN1>
<old>100</old>
<new>100</new>
</IN1>
<IN2>
<IN21>
<old>200</old>
<new>200</new>
</IN21>
<IN22>
<old>300</old>
<new>300</new>
</IN22>
</IN2>
</INPUT>

----[出力側]-----
<OUTPUT>
<OUT1>
<OUT11>
<old>100</old>
<new>100</new>
</OUT11>
<OUT12>
<OUT121>
<old>200</old>
<new>200</new>
</OUT121>
<OUT122>
<old>300</old>
<new>300</new>
</OUT122>
</OUT12>
</OUT1>
</OUTPUT>


【質問内容】
 集団項目でないタグ(入力側のIN1およびIN2)を集団項目として出力したい

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:7件)
  • 参考になった:0件
  • 回答者:MetalKing
  • 回答日時:2005/01/24 23:46

いろいろと解らないことがあってwebで検索していると、最終的に行き着くのは本家(www.w3.org)だったってことがよくあります。↓のURLは日本語サイトです。

# XSLT は「論よりRUN」で覚えたような気もします...

通報する

  • 参考になった:0件

No.5ベストアンサー20pt

  • 回答者:MetalKing
  • 回答日時:2005/01/24 19:08

> 入力側のIN1,IN2が複数回繰り返された場合、
> 出力側もOUT1が複数回繰り返されるって感じです。

IN1とIN2が必ず1対1に対応するという条件でいいなら(複数の組が存在しても可)これでいけるでしょう。



IN1およびIN2以下の構造はオリジナルのまま出力されます。

<xsl:template match="INPUT">
 <OUTPUT>
  <xsl:apply-templates />
 </OUTPUT>
</xsl:template>
<xsl:template match="IN1">
 <xsl:text disable-output-escaping="yes">&lt;OUT&gt;</xsl:text>
  <xsl:copy-of select="." />
</xsl:template>
<xsl:template match="IN2">
 <xsl:copy-of select="." />
 <xsl:text disable-output-escaping="yes">&lt;/OUT&gt;</xsl:text>
</xsl:template>

通報する

この回答へのお礼

MetalKingさん、ありがとうございました。
上手くいきました。
いろいろなご教授ありがとうございました。
最後にもう1つ、ご教授願います。

 <xsl:text disable-output-escaping="yes">">&lt;OUT&gt;</xsl:text>

xsl:text命令はこれまで何回か使用した事が
あるのですが、属性(disable-output-escaping)は
使用した事がないので個人的にもう少し調べてみようと思っているのですが(text命令だけでなく他も含めて)、MetalKingさんが使用されているHPで「ここは分かりやすくてためになるぞ!!」みたいなHPがありましたら、教えていただきたいのですが...。

MetalKingさん以外の方でも、全然かまいませんので
宜しくお願いいたします。

  • 参考になった:0件
  • 回答者:tachiwa
  • 回答日時:2005/01/24 15:39

#2さんのを少し変えてみました。
参考にしてください。下段に###出力###を書いておきます。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="Shift_JIS"/>
<xsl:template match="INPUT">
<OUTPUT>
<OUT1>
<xsl:apply-templates />
</OUT1>
</OUTPUT>
</xsl:template>
<xsl:template match="IN1">
<OUT11>
<xsl:copy-of select="./*" />
</OUT11>
</xsl:template>
<xsl:template match="IN2">
<OUT12>
<xsl:apply-templates/>
</OUT12>
</xsl:template>
<xsl:template match="IN21">
<OUT121>
<xsl:copy-of select="./*" />
</OUT121>
</xsl:template>
<xsl:template match="IN22">
<OUT122>
<xsl:copy-of select="./*" />
</OUT122>
</xsl:template>
</xsl:stylesheet>

###出力###
<?xml version="1.0" encoding="Shift_JIS"?>
<OUTPUT>
<OUT1>
<OUT11>
<old>100</old>
<new>100</new>
</OUT11>
<OUT12>
<OUT121>
<old>200</old>
<new>200</new>
</OUT121>
<OUT122>
<old>300</old>
<new>300</new>
</OUT122>
</OUT12>
</OUT1>
</OUTPUT>

通報する

  • 参考になった:0件
  • 回答者:MetalKing
  • 回答日時:2005/01/24 00:20

当初、<OUT2>や<OUT3>は無かったようですけど?


提示したコードは
 <INPUT> → <OUTPUT> さらに <OUT1> 追加
 <IN1> → <OUT11>
 <IN2> → <OUT12>
 <IN21> → <OUT121>
 <IN22> → <OUT122>
となるはずですが

出力のタグ名が変わっているだけで、構造はあってそうな気がしますけど...勘違いしてる?

通報する

この回答への補足

アドバイスありがとうございます。

>当初、<OUT2>や<OUT3>は無かったようですけど?
イメージですのでご容赦を...。

>出力のタグ名が変わっているだけで、構造はあってそうな気がしますけど...勘違いしてる?
MetalKingさんは勘違いされていません。


ごめんなさい。私の質問不足です。
もう1つ大事な質問をするのを忘れていました。

入力側のIN1,IN2が複数回繰り返された場合、
出力側もOUT1が複数回繰り返されるって感じです。


[入力]
<INPUT>
<IN1> 1回目

</IN1>
<IN2> 1回目

</IN2>
<IN1> 2回目

</IN1>
<IN2> 2回目

</IN2>
<INPUT>

[出力]
<OUTPUT>
<OUT1> ---> この要素が追加(開始:1回目)
<OUT2> ---> IN1に該当(1回目)

</OUT2>
<OUT3> ---> IN2に該当(1回目)

</OUT3>
</OUT1> ---> この要素が追加(終了:1回目)


<OUT1> ---> この要素が追加(開始:2回目)
<OUT2> ---> IN1に該当(2回目)

</OUT2>
<OUT3> ---> IN2に該当(2回目)

</OUT3>
</OUT1> ---> この要素が追加(終了:2回目)

<OUTPUT>


たびたびごめんなさい。
これでイメージはつかめるでしょうか?

  • 参考になった:0件
  • 回答者:MetalKing
  • 回答日時:2005/01/23 21:57

こういうことでしょうか?

<xsl:template match="INPUT">
 <OUTPUT>
  <OUT1>
   <xsl:apply-templates />
  </OUT1>
 </OUTPUT>
</xsl:template>
<xsl:template match="IN1">
 <OUT11>
  <xsl:copy-of select="./*" />
 </OUT11>
</xsl:template>
<xsl:template match="IN2">
 <OUT12>
  <xsl:copy-of select="./*" />
 </OUT12>
</xsl:template>
<xsl:template match="IN21">
 <OUT121>
  <xsl:copy-of select="./*" />
 </OUT121>
</xsl:template>
<xsl:template match="IN22">
 <OUT122>
  <xsl:copy-of select="./*" />
 </OUT122>
</xsl:template>

通報する

この回答への補足

回答ありがとうございます。
もう少しなのですが...。
私のイメージとしましては、こんな感じです。
値は省略します。

[入力]
<INPUT>
<IN1>

</IN1>
<IN2>

</IN2>
<INPUT>

[出力]
<OUTPUT>
<OUT1> ---> この要素が追加(開始)
<OUT2> ---> IN1に該当

</OUT2>
<OUT3> ---> IN2に該当

</OUT3>
</OUT1> ---> この要素が追加(終了)
<OUTPUT>


いろいろアドバイスをいただき誠にありがとうございます。
よろしければもう少しご教授願います。

  • 参考になった:0件
  • 回答者:MetalKing
  • 回答日時:2005/01/23 13:26

IN1 IN2 を含む構造(OUT1)を追加したいだけでしょうか?

<xsl:template match="INPUT">
 <OUTPUT>
   <OUT1>
    <xsl:apply-templates />
   </OUT1>
 </OUTPUT>
</xsl:template>
以下省略

通報する

この回答への補足

説明足らずで申し訳ありません。
正確に言いますと、

OUT1配下にOUT11とOUT12を作成しますが、そのOUT12配下にIN1とIN2(出力側でいうところのOUT121,OUT122)の要素を設定したいという事です。

  
このQ&Aは役に立ちましたか?(役に立った:7件)

このページのトップへ

このカテゴリで人気のQ&A

RSSフィード

Facebook公式ページ

公式Twitter