- PR -

document関数による外部データの取り扱い方

1
投稿者投稿内容
deko
会議室デビュー日: 2006/12/11
投稿数: 1
投稿日時: 2006-12-11 21:25
みなさん よろしくおねがいします。

"a.xml"のテンプレートファイル"b.xsl"にdocument関数を使い、"c.xml"を読ませています。
また、この"c.xml"のデータの内容をposition関数を使い、3列ずつの表として表示させています。

ここまでは問題なかったのですが、4列構成にして1列目に見出し的項目(<mmm>タグ)を追加すべく
ifにて<ccc>のpositionが"1"の時だけそこの横に表示させるという様に構築してみましたがうまくいきません。

(注1)の部分の代わりに
<xsl:variable name="c"select="document('c.xml')/d/data"/>
<xsl:for-each select="$c/c/ccc[position() mod 3 = 1]">
としてみましたが、同様でした。

その後、不具合検証の為(注2)の部分に
<td><xsl:value-of select="position()" /></td>
をいれ、きちんとカウントされているか調査したところ、
正常なら1.2.3.4.5で繰り返し1.2.3.4.5.6となるところですが
頭から通しで1〜11となっていました。

また、これらと同様ですが、document関数を使わないで単純なテンプレートとして
"d.xsl"を作り、変換したところ、問題なく正常に表記されました。

ヒントなどでも結構です、問題点の御指摘 よろしくおねがいします。

----b.xsl----


(注1) <xsl:for-each select="document('c.xml')/d/data/c/ccc[position() mod 3 = 1]"> (/注1)

<tr>
<td>
<xsl:if test="position()=1">
<xsl:value-of select="../../mmm" />

</td>

(注2)

<td><xsl:value-of select="."/></td>
<td><xsl:value-of select="following-sibling::case[1]"/></td>
<td><xsl:value-of select="following-sibling::case[2]"/></td>

</tr>


---- c.xml ----
<d>
<data>
<mmm>111
<c>
<ccc>a
<ccc>b
<ccc>c
<ccc>d
<ccc>e
<ccc>f


<data>
<mmm>222
<c>
<ccc>a
<ccc>b
<ccc>c
<ccc>d
<ccc>e
<ccc>f





最終的になりたい結果
<tr>
<td>111</td>
<td>a</td>
<td>b</td>
<td>c</td>
</tr>
<tr>
<td></td>
<td>d</td>
<td>e</td>
</tr>
<tr>
<td>222</td>
<td>a</td>
<td>b</td>
<td>c</td>
</tr>
<tr>
<td></td>
<td>d</td>
<td>e</td>
<td>f</td>
</tr>


[ メッセージ編集済み 編集者: deko 編集日時 2006-12-11 21:31 ]
ひだちのいろ
会議室デビュー日: 2007/02/14
投稿数: 9
投稿日時: 2007-02-14 16:02
こんにちは。

対処療法的ですが、「b.xsl」の「position()=1」を「count(preceding-sibling::ccc)=0」に直すと上手くいくようです。

質問からだいぶ時間がたっていますが、お役に立てれば幸いです。
1

スキルアップ/キャリアアップ(JOB@IT)