最新閲覧日:

例えば

<title>タイトルA</title>
<P>no1</P>
<P>no2</P>
<P>no3</P>
<P>no4</P>
<title>タイトルB</title>
<P>no5</P>
<P>no6</P>
<P>no7</P>
<P>no8</P>

というようなxmlがあったとします。

xslを適用して、
タイトルA
no1
no2
no3
no4
タイトルB
no5
no6
no7
no8
と表示するにはどのようにすればよいのでしょうか?

<xsl:for-each select="//P">
 <P><value-of select="."/></P>
</xsl:for-each>

ではnoのみが表示され、タイトルが表示されず、また、

<xsl:for-each select="//title">
 <P><xsl:value-of select="."/></P>
 <xsl:for-each select="../P">
  <P><xsl:value-of select="."/></P>
 </xsl>
</xsl>

では、
タイトルA
no1
no2
no3
no4
no5
no6
no7
no8
タイトルB
no1
no2
no3
no4
no5
no6
no7
no8

となってしまいます。

A 回答 (1件)

 だいぶ経ってしまっているので、回答が役に立つのか分かりませんが、


一応書いておきます。

 正確な意図が分かりにくいので、この回答が見当違いかもしれません。


<xsl:for-each select="//title">
 <P><xsl:value-of select="."/></P>
 <xsl:for-each select="../P">
  <P><xsl:value-of select="."/></P>
 </xsl>
</xsl>

と記述しようとしている場所に

<xsl:apply-templates select="//title | //P"/>

と記述しておいて、

<xsl:template match="title">
 <!-- title要素に対する処理 -->
</xsl:template>

<xsl:template match="P">
 <!-- P要素に対する処理 -->
</xsl:template>

というテンプレートを呼び出すようにすれば良いのでは?

 もちろん、apply-templatesでtitle要素とP要素を区別しない点が
意図と異なるかもしれませんが。


 この場合のデータ構造があまり良くないので、例えば

<Group>
 <title>タイトルA</title>
 <P>no1</P>
 <P>no2</P>
 <P>no3</P>
 <P>no4</P>
</Group>
<Group>
 <title>タイトルB</title>
 <P>no5</P>
 <P>no6</P>
 <P>no7</P>
 <P>no8</P>
</Group>

のようにデータ構造をより良いものにしてから、
という手もあります。
こうするとだいぶ処理が楽になります。


 最後に、余計な忠告かもしれませんが、
xsl:for-eachにこだわり過ぎないで柔軟に考えた方が良いのでは、
と私は思います。
    • good
    • 0

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


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ