• 締切済み

XSLTでの構造変換について

以下のパタンのXMLデータをXSLT1.0で構造変換する方法について教えてください。 【パターン1】 <名前>吉田 太郎</名前> ↓ <会長名前>吉田 太郎</会長名前> <会長英字></会長英字> 【パターン2】 <名前>吉田 太郎(YOSHIDA TARO)</名前> ↓ <会長名前>吉田 太郎</会長名前> <会長英字>YOSHIDA TARO</会長英字> 【パターン3】 <名前>吉田 太郎(YOSHIDA TARO).石川 桃子(ISHIKAWA MOMOKO).細川 隆(HOSOKAWA TAKASHI)</名前> ↓ <会長名前>吉田 太郎</会長名前> <会長英字>YOSHIDA TARO</会長英字> <副会長名前>石川 桃子</副会長名前> <副会長英字>ISHIKAWA MOMOKO</副会長英字> <書記名前>細川 隆</書記名前> <書記英字>HOSOKAWA TAKASHI</書記英字> 【パターン4】 <名前>Abraham Lincoln F.(F.Abraham Lincoln)</名前> ↓ <会長名前>Abraham Lincoln F.</会長名前> <会長英字>F.Abraham Lincoln</会長英字> XML文書の「名前」要素のパターンには上記の4種類があり,XSLTを使用して目的の構造に変換するXSLTの記述方法を教えてください。

  • XML
  • 回答数2
  • ありがとう数1

みんなの回答

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.2

<xsl:variable name="name" select="..." /> で $name に<名前>要素のテキストが入っているとすると <xsl:choose>   <xsl:when test="contains($name, ').'">     <xsl:variable name="kaicho" select="substring-before($name, ').')" />     <xsl:variable name="name2" select="substring-after($name, ').')" />     <xsl:choose>       <xsl:when test="contains($name2, ').'">         <xsl:variable name="fukukaicho" select="substring-before($name2, ').')" />         <xsl:variable name="shoki" select="substring-after($name2, ').')" />       </xsl:when>       <xsl:otherwise>         <xsl:variable name="fukukaicho" select="$name2" />         <xsl:variable name="shoki" select="" />       </xsl:otherwise>     </xsl:choose>   </xsl:when>   <xsl:otherwise>     <xsl:variable name="kaicho" select="$name" />     <xsl:variable name="fukukaicho" select="" />     <xsl:variable name="shoki" select="" />   </xsl:otherwise> <xsl:choose> ここまでで、$kaicho, $fukukaicho, $shoki には、 「」か「なまえ」か「なまえ(namae」が入っているはず。 後は順に <xsl:choose><!-- 会長 -->   <xsl:when test="contains($kaicho,'(')">     <会長名前><xsl:value-of select="substring-before($kaicho,'(')" /></会長名前>     <会長英字><xsl:value-of select="substring-after($kaicho,'(')" /></会長英字>   </xs:when>   <xsl:otherwise>     <会長名前><xsl:value-of select="$kaicho" /></会長名前>     <会長英字></会長英字>   </xsl:otherwise> </xsl:choose> <xsl:choose><!-- 副会長 -->   <!-- 省略 --> </xsl:choose> <xsl:choose><!-- 書記 -->   <!-- 省略 --> </xsl:choose> していけばいいようなきがするけど、確認してないからちょっとあやしいかも。。。

tabokun01
質問者

お礼

回答ありがとうございます。 教えていただいた内容をもとに,XSLTを作成して確認していますが,変数またはパラメータが参照できないようで,まだうまくいっていませんが,なんとなく流れはイメージできました。 XSLTについては,勉強中ということもあり,試行錯誤していますが,教えていただいた内容をまずは理解し,参考にさせていただきながら完成させたいと思います。 ありがとうございましたm(__)m

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.1

XPath の文字列関数を使えばできそうだよ。 http://www.atmarkit.co.jp/fxml/tecs/014xpath/14.html http://www.w3.org/TR/xpath/#section-String-Functions それにしても、変換前の XML のデータひどいね。。。 こんなに XML っぽくないデータは xslt で変換するより sed で正規表現を使って変換したほうが方が楽だとおもう。。。 【パターン3】 /<名前>\([^(]*\)(\([^)]*\))\.\([^(]*\)(\([^)]*\))\.\([^(]*\)(\([^)]*\))/s//<会長名前>\1<\/会長名前>\n<会長英字>\2<\/会長英字>\n<副会長名前>\3<\/副会長名前>\n<副会長英字>\4<\/副会長英字>\n<書記名前>\5<\/書記名前>\n<書記英字>\6<\/書記英字>\n/ 【パターン2】【パターン4】 /<名前>\([^(]*\)(\([^)]*\))<\/名前>/s//<会長名前>\1<\/会長名前>\n<会長英字>\2<\/会長英字>/ 【パターン1】 /<名前>\([^<]*\)<\/名前>/s//<会長名前>\1<\/会長名前>/ ~ $ cat source.txt <名前>吉田 太郎(YOSHIDA TARO).石川 桃子(ISHIKAWA MOMOKO).細川 隆(HOSOKAWA TAKASHI)</名前> <名前>吉田 太郎(YOSHIDA TARO)</名前> <名前>Abraham Lincoln F.(F.Abraham Lincoln)</名前> <名前>吉田 太郎</名前> ~ $ cat transform.sed /<名前>\([^(]*\)(\([^)]*\))\.\([^(]*\)(\([^)]*\))\.\([^(]*\)(\([^)]*\))<\/名前>/s//<会長名前>\1<\/会長名前>\n<会長英字>\2<\/会長英字>\n<副会長名前>\3<\/副会長名前>\n<副会長英字>\4<\/副会長英字>\n<書記名前>\5<\/書記名前>\n<書記英字>\6<\/書記英字>/ /<名前>\([^(]*\)(\([^)]*\))<\/名前>/s//<会長名前>\1<\/会長名前>\n<会長英字>\2<\/会長英字>/ /<名前>\([^<]*\)<\/名前>/s//<会長名前>\1<\/会長名前>/ ~ $ sed -f transform.sed source.txt <会長名前>吉田 太郎</会長名前> <会長英字>YOSHIDA TARO</会長英字> <副会長名前>石川 桃子</副会長名前> <副会長英字>ISHIKAWA MOMOKO</副会長英字> <書記名前>細川 隆</書記名前> <書記英字>HOSOKAWA TAKASHI</書記英字> <会長名前>吉田 太郎</会長名前> <会長英字>YOSHIDA TARO</会長英字> <会長名前>Abraham Lincoln F.</会長名前> <会長英字>F.Abraham Lincoln</会長英字> <会長名前>吉田 太郎</会長名前> ~ $

tabokun01
質問者

補足

回答ありがとうございました。 一部補足させてもらいます。 全て下記の構造に変換したいのです。 【パターン1】 <名前>吉田 太郎</名前> ↓ <会長名前>吉田 太郎</会長名前> <会長英字></会長英字> <副会長名前></副会長名前> <副会長英字></副会長英字> <書記名前></書記名前> <書記英字></書記英字> 【パターン2】 <名前>吉田 太郎(YOSHIDA TARO)</名前> ↓ <会長名前>吉田 太郎</会長名前> <会長英字>YOSHIDA TARO</会長英字> <副会長名前></副会長名前> <副会長英字></副会長英字> <書記名前></書記名前> <書記英字></書記英字> 【パターン3】 <名前>吉田 太郎(YOSHIDA TARO).石川 桃子(ISHIKAWA MOMOKO).細川 隆(HOSOKAWA TAKASHI)</名前> ↓ <会長名前>吉田 太郎</会長名前> <会長英字>YOSHIDA TARO</会長英字> <副会長名前>石川 桃子</副会長名前> <副会長英字>ISHIKAWA MOMOKO</副会長英字> <書記名前>細川 隆</書記名前> <書記英字>HOSOKAWA TAKASHI</書記英字> 【パターン4】 <名前>Abraham Lincoln F.(F.Abraham Lincoln)</名前> ↓ <会長名前>Abraham Lincoln F.</会長名前> <会長英字>F.Abraham Lincoln</会長英字> <副会長名前></副会長名前> <副会長英字></副会長英字> <書記名前></書記名前> <書記英字></書記英字> 回答いただきましたXPathのsubstring-afterやsubstring-beforeを使ってやっているのですが,パターン1とパターン3の処理が上手くいきません。というより私があまりにも知識がないからだと思いますが...。 なんとか1つのXSLTで複数のXMLファイルを一括で構造変換できる方法を試行錯誤しているのですが,やはりXSLTでは難しいのでしょうか?

関連するQ&A

  • Outlookの宛先

    Outlookの宛先に名前を入力するとリストが表示されますが、一部の名前が英字で登録されています。日本語に変更する場合はどうすればよいのでしょうか? 例) 山田太郎(Taro-Yamada@...)が"山田"ではなく、"Taro"でないと表示されない。 よろしくお願いします。

  • XSLT変換について

    以下のようにファイルを作成してみました。 ローカルではIEに表示できるのですが,アップすると表示されず「スタイルシートにドキュメント要素が含まれていません。スタイルシートが空であるか、正しく構成された XMLドキュメントでない可能性があります。」というコメントが出ます。ご存知の方いらっしゃいましたらどうか教えてください。 ↓作成したファイル 「top.xml」(省略) 「top.xsl」 <?xml version="1.0" encoding="Shift_JIS" ?> <xsl:stylesheet xmlns:xsl="(省略)" version="1.0"> <xsl:import href="./note.xsl" /> <xsl:output method="html" encoding="Shift_JIS" /> <xsl:template match="/">  <html xmlns="(省略)" xml:lang="ja" lang="ja">  <head>   <meta http-equiv="Content-Type"    content="text/html; charset=Shift_JIS" />   <title><xsl:value-of   select="/top/title" /></title>  </head>  <body>   <xsl:call-template name="header" />   <div align="center"><h1>HOME PAGE</h1></div>   <table> <tr><th>CONTENTS</th></tr> <xsl:for-each select="/top/contents"> <tr><th><a href="{url}"><xsl:value-of      select="label" /></a></th>      <td><small><xsl:value-of      select="text" /></small></td></tr> </xsl:for-each>   </table><br />   <xsl:call-template name="footer" />  </body>  </html> </xsl:template> </xsl:stylesheet> 「note.xsl」(top.xslにおけるxsl:importをコメントアウトしても結果は変わらなかったため,記載省略。)

    • 締切済み
    • XML
  • XSLT変換について

    XSLT変換により,HTMLやテキストファイルに変換することができますが,XSLファイルには変換できるのでしょうか。 情報をくださいますようお願いします。

    • ベストアンサー
    • XML
  • 名前の表現

     山田太郎を英語で表記する時は[Tarou Ymada]が一般的ですね。  では中国人、韓国人の場合はどうなるのでしょうか金大中は[Dejun Kimu]とでも表記するのですか。  John F Kennedyを日本語で表現する時は「ジョン・F・ケネディ」ですね。中国、韓国ではどう表現しているのでしょうか。  数年前パスポートの申請では[Ymada Taro]でも良いと言われました。しかし[Tarou][Talou]は使えないといわれました。自分の名前なのに残念でした。私としては[r]の発音は苦手なので[Talou]が気に入っています。  

  • XSLTでの変換後のソース

    いつもお世話になっております。 先日、http://okwave.jp/qa3940547.html においてXMLをXSLTで変換する環境を教えていただいたのですが、現状XML Editer(IEのアドイン?)で結果を見ているのですが、ソースを見てみても変換前のXMLの内容しか見れず、変換後のタグとかがきちんとなっているのか確認できません。 EXCELで開くとそれらしく見れる方法があるのですが、希望する程のものではありません。 何かよいツール(できたらフリーのもの)とかありませんでしょうか。もしくは変換したものがファイルとして吐き出されるものでもよいです。 こちらは、オフィス2007やVS2005やVS2008は所有しております。これらでできる場合もお願いします。 よろしくお願いします。

    • ベストアンサー
    • XML
  • XSLTについて

    XML文書内でスペース2つの要素に対してxsltでスペースの長さ回だけ&nbsp:に変換しようとしているのですが、xslt内ではスペースが1つしか渡ってこないのですがこれはどうしてなのでしょうか? もし参考のwebページ等がありましたら教えてください。 sample.xml <a>__</a>

    • 締切済み
    • XML
  • XSLT

    いつもお世話になっております。 次のXSLTの結果がどうしてそうなるのかわからないので教えてください。 解説には、「処理は必ずルートノードのテンプレートから始まります」と書いてあるんですが、できましたら、その辺もからめて、どういう処理の流れになるのか、カレントノードがどう移動していくのか、教えていただけると助かります。 (XML) <?xml version="1.0" encoding="Shift_JIS"?> <Conference Situation="Reserved" Equipment="Projector">  <Room>会議室</Room>  <User>山田太郎   <Date>2008/05/08</Date>   <Time>10:00-12:00</Time>  </User>  <Number>4名</Number> </Conference> (XSLT) <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  <xsl:output method="text" />  <xsl:template match="/Conference">   <xsl:value-of select="Number" />  </xsl:template>  <xsl:template match="Conference/User">   <xsl:value-of select="Date" />  </xsl:template>  <xsl:template match="/">   <xsl:value-of select="Conference/Room" />  </xsl:template> </xsl:stylesheet> (結果) 会議室

    • ベストアンサー
    • XML
  • XSLT

    すいません、再び質問があったのですが書く前に締め切ってしまいましたので新しく作らせていただきます。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2093554&rev=1 のNo.4を見て書いてみたのですが、 IE---XSLTファイル内に書いてあるテーブルタグが動作しない、 Firefox---XSLTファイル内に直接書いてある文字が表示されない という状態になってしまいました。 ちなみにXSLTファイルをFirefoxに放り込むと 「この XML ファイルにはスタイル情報が関連づけられていないようです。以下にドキュメントツリーを表示します。」 と表示されますが何か関係があるのでしょうか・・・?

    • ベストアンサー
    • XML
  • XSLTについて

    何方かご存知でしたら、ご教授下さい。 こんなXMLがあります。 <book>  <ジャンプ>200円</ジャンプ>  <マガジン>210円</マガジン>  <サンデー>200円</サンデー> : :(可変) </book> 上記のXMLをHTMLでこのように表示します。 <table>  <tr>   <td>ジャンプ</td>   <td>200円</td>  </tr>  <tr>   <td>マガジン</td>   <td>210円</td>  </tr>  <tr>   <td>サンデー</td>   <td>200円</td>  </tr> </table> <book>の子ノードは可変で、どんな要素名がくるかわかりません。 このときにどのようなXSLTを作成すればよいでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • XML
  • XSLTについて

    入力となるXMLの要素Aに属性が複数存在した場合に、ある属性以外のすべての属性を要素Bに付与して出力したいのですがどのようなXSLTで記述すればいいのでしょうか? 入力例) <sample> <要素 aa="1" bb="2" cc="3">AAAAAAA</要素> </sample> 出力例) <sample> <youso bb="2">AAAAA</youso> </sample> XSLT) <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/ 1999/XSL/Transform" version="1.0"> <xsl:template match="/">   <sample> <xsl:apply-templates/> </sample> </xsl:template> <xsl:template match="要素"> <xsl:copy> <!-- <xsl:copy-of select="@*"/> -->☆ </xsl:copy> </xsl:template> </xsl:stylesheet>

    • 締切済み
    • XML

専門家に質問してみよう