ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

XMLコミュの無限に入れ子になりうる兄弟がテキストになりうる要素

  • mixiチェック
  • このエントリーをはてなブックマークに追加
以下のように XML から出力を得るために、XSL を書きました (いずれも例;抜粋):

(XML: eqnarray 内に equation はいくつでも書ける)
<eqnarray><equation>
1+1/<square>1+1/<curly>1+1/<round>1+1/<square>1+1/<round>1+1/<round>1+1/<curly>...</curly></round></round></square></round></curly></square>
</equation></eqnarray>

(出力)
1+1/[1+1/{1+1/(1+1/[1+1/(1+1/(1+1/{...}))])}]

(XSL)
<xsl:template match="eqnarray"><xsl:for-each select="equation">

<xsl:for-each select="square">
[<xsl:value-of select="." />]
</xsl:for-each>
<xsl:for-each select="round">
(<xsl:value-of select="." />)
</xsl:for-each>
<xsl:for-each select="curly">
{<xsl:value-of select="." />}
</xsl:for-each>
<xsl:for-each select="text()">
<xsl:value-of select="." />
</xsl:for-each>

</xsl:for-each></xsl:template>
<xsl: >

しかしこれでは、square, round, curly, text() の順に並べ替えられて表示されてしまい、
また、equation の直接の子要素にしか適用されません。

このように
・無限に入れ子になりうる
・兄弟がテキストになりうる
要素について、もとのXMLに記述された順番で処理する方法はありますか。

コメント(2)

xsl:for-each ではなく、xsl:template と xsl:apply-templates を使いましょう。xsl:template の中で xsl:apply-templates を呼び出せば再帰的な入力に対して再帰的にテンプレートが適用されます。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="eqnarray">
<xsl:for-each select="equation">
<xsl:apply-templates />
</xsl:for-each>
</xsl:template>

<xsl:template match="square">
<xsl:text>[</xsl:text>
<xsl:apply-templates />
<xsl:text>]</xsl:text>
</xsl:template>

<xsl:template match="round">
<xsl:text>(</xsl:text>
<xsl:apply-templates />
<xsl:text>)</xsl:text>
</xsl:template>

<xsl:template match="curly">
<xsl:text>{</xsl:text>
<xsl:apply-templates />
<xsl:text>}</xsl:text>
</xsl:template>

<xsl:template match="text()">
<xsl:value-of select="."/>
</xsl:template>

</xsl:stylesheet>

というか、こっちが基本です。xsl:for-each は再帰呼び出しを避けてその場限りのテンプレートを適用するための簡単な書き方です(mode 付きの xsl:template + xsl:apply-templates で置き換え可能)。入門書などで基本から勉強しましょう。
すごい! XMLは今日初めて書いたのですが、実際基本から勉強してみたくなりました。
ありがとうございました。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

XML 更新情報

XMLのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング