アプリ版:「スタンプのみでお礼する」機能のリリースについて

みなさんよろしくおねがいします。

早速ですが、
ソース"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"を作り、変換したところ、問題なく正常に表記されました。

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

A 回答 (3件)

ちと訂正


【誤】
====================b.xml======================
【正】
====================b.xsl======================
    • good
    • 0

実は・・・今ひとつ、何をやろうとして何がうまくいかないのか理解できませんでした。

そのため、一応こちらで実験したソースを出しますが、回答者さまの求めるものではないかもしれません。

====================a.xml=======================

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="b.xsl"?>
<hoge>
</hoge>

====================b.xml======================

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="html" encoding="UTF-8" indent="yes" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" />
<xsl:variable name="c" select="document('c.xml')/d"/>
<xsl:template match="/">
<html>
<style type="text/css">
table,tr,td{border:red solid;}
</style>
<body>
<table summary="">
<caption>Experiment</caption>
<xsl:apply-templates select="$c/data" />
</table>
</body>
</html>
</xsl:template>

<xsl:template match="data">
<xsl:apply-templates select="c" />
</xsl:template>

<xsl:template match="c">
<xsl:apply-templates select="ccc" />
</xsl:template>

<xsl:template match="ccc">

<xsl:if test="position() mod 3 ='1'">
<tr>
<td>
<xsl:if test="position() = '1'">
<xsl:value-of select="../../mmm" />
</xsl:if>
</td>
<td><xsl:value-of select="."/></td>
<td><xsl:value-of select="following-sibling::ccc[1]"/></td>
<td><xsl:value-of select="following-sibling::ccc[2]"/></td>

</tr>
</xsl:if>
</xsl:template>

</xsl:stylesheet>
=============================c.xml=====================
<?xml version="1.0" encoding="Shift_JIS"?>
<d>
<data>
<mmm>111</mmm>
<c>
<ccc>a</ccc>
<ccc>b</ccc>
<ccc>c</ccc>
<ccc>d</ccc>
<ccc>e</ccc>
<ccc>f</ccc>
</c>
</data>
<data>
<mmm>222</mmm>
<c>
<ccc>a</ccc>
<ccc>b</ccc>
<ccc>c</ccc>
<ccc>d</ccc>
<ccc>e</ccc>
<ccc>f</ccc>
</c>
</data>
</d>

a.xml,b.xsl,c.xmlは同一ディレクトリ内にあるものとします。

なお、当方による実験ではselectへの
ccc[position() mod 3 = 1]
の指定でエラーが出てしまったため、掲示のソースを変更してしまっています。この点が重要なことで(私の回答が問題なので)したらおっしゃってください。

a.xmlを開くことで
手元のFirefox(Minefield)ではc.xmlのデータを利用しつつ、a.xmlにスタイルを当てることができ、HTMLとして扱うことができました。
違うのであれば違う点を補足しておっしゃってください。考え直してきます。

#少し冗長なのは私の思考力の無さが原因です
    • good
    • 0
この回答へのお礼

わざわざありがとうございます。
また、説明不足で申し訳ありませんでした。

経緯を説明しますと、a.xmlとb.xslとで、完成しているシステムがあり
そこに新たにc.xmlのデータを表形式で表示したいので既存のb.xslの手直し作業というものでした。

頂きましたご回答の”a.xmlを開くことで
c.xmlのデータを利用しつつ、a.xmlにスタイルを当てることができ、HTMLとして扱うこと”というのは私的に無い頭を振り絞ってなんとか
解決することが出来ました。

で、ご指摘の”何をやりたいのか?”という点ですが、
追加説明の***やりたいこと***のタグなんですが
___________________
|111| a | b | c |
|   | d | e |  |
|222| a | b | c |
|   | d | e | f |
-------------------
というような表を作りたかったということでした。

私の表記したサンプルだと
___________________
|111| a | b | c |
|   | d | e |  |
|   | a | b | c |
|   | d | e | f |
-------------------
というふうになってしまい、222がぬけています。
そこをposition関数でカウントさせたところ、「6」でした
222の横の「a」のpositionが「1」となるような、プログラムが
必要でした。

それが for-eachの指定が悪いのか、Document関数の使い方が悪いのか
というのが見当がつかず、このようなわかり辛い質問になってしまいました。

たいへんありがたいご回答ですが、今現在検証する環境がないので、
検証後、改めてまたお礼に参ります。

ありがとうございました

お礼日時:2006/12/27 02:27

すみません


質問者の別IDです。
追加で書き込もうとしましたが、誰かの返信という形で無いと
追加できないようなので、先ほど別IDをとってきました。

その他の補足説明が文章が長くて書ききれませんでした。
以下に続きます

この回答への補足

追加です。


** 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" />
</xsl:if>
</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>

</xsl:for-each>


** c.xml **
<d>
<data>
<mmm>111</mmm>
<c>
<ccc>a</ccc>
<ccc>b</cccc>
<ccc>c</ccc>
<ccc>d</cccc>
<ccc>e</ccc>
<ccc>f</cccc>
</c>
</data>
<data>
<mmm>222</mmm>
<c>
<ccc>a</ccc>
<ccc>b</cccc>
<ccc>c</ccc>
<ccc>d</cccc>
<ccc>e</ccc>
<ccc>f</cccc>
</c>
</data>
</d>

やりたいこと***
<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>

補足日時:2006/12/11 03:25
    • good
    • 0

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