• 締切済み

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の記述方法を教えてください。

みんなの回答

  • 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