アプリ版:「スタンプのみでお礼する」機能のリリースについて

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)を集団項目として出力したい

A 回答 (6件)

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

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

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

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

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

お礼日時:2005/01/24 23:17

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

↓のURLは日本語サイトです。

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

参考URL:http://www.infoteria.com/jp/contents/xml-data/RE …
    • good
    • 0

#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>
    • good
    • 0

当初、<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>


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

補足日時:2005/01/24 00:37
    • good
    • 0

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



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


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

補足日時:2005/01/23 23:59
    • good
    • 0

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



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

この回答への補足

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

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

補足日時:2005/01/23 21:26
    • good
    • 0

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