みなさんよろしくおねがいします。
早速ですが、
ソース"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件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
ちと訂正
【誤】
====================b.xml======================
【正】
====================b.xsl======================
No.2
- 回答日時:
実は・・・今ひとつ、何をやろうとして何がうまくいかないのか理解できませんでした。
そのため、一応こちらで実験したソースを出しますが、回答者さまの求めるものではないかもしれません。====================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として扱うことができました。
違うのであれば違う点を補足しておっしゃってください。考え直してきます。
#少し冗長なのは私の思考力の無さが原因です
わざわざありがとうございます。
また、説明不足で申し訳ありませんでした。
経緯を説明しますと、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関数の使い方が悪いのか
というのが見当がつかず、このようなわかり辛い質問になってしまいました。
たいへんありがたいご回答ですが、今現在検証する環境がないので、
検証後、改めてまたお礼に参ります。
ありがとうございました
No.1
- 回答日時:
すみません
質問者の別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>
略
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- JavaScript 電車の運賃を出すプログラムを作っています。 2 2022/06/22 09:36
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Excel(エクセル) Excel(エクセル)でフィルター抽出後、非表示の行を計算しないで、合計を算出する方法 【内容】 添 4 2023/01/30 17:17
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) [Excel2016] 相関表等の自動作成 2 2022/08/01 20:34
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XSLで、XMLの空タグを制御したい。
-
ノードの並び替え
-
タグの有無の判定
-
xslでの最小値、最大値の取得
-
xmlのテキストにリンクを張りた...
-
XMLのHTMLへの変換 (初心者)
-
CPUの考え方を教えてください ...
-
XMLで要素が記述された順番に意...
-
バッチファイルでテキストファ...
-
昔Winnyってありましたけど、あ...
-
あせんうぶり言語
-
VB6でXMLを作成しているのです...
-
SNMP リンクダウンとノードダ...
-
あるノードリストに、特定の名...
-
HTTPステータス 404 - There is...
-
コンテキストメニュークリック...
-
Listからのnull要素を削除方法は?
-
ルート要素ノードが2個ある場合?
-
ノードとは
-
このエラー、何とかなりません...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XSLで、XMLの空タグを制御したい。
-
タグの有無の判定
-
XSLでXMLデータをタブ区切りデ...
-
XSLTで固定長データファイルを...
-
XSL中の改行、タブを無効にした...
-
xmlのテキストにリンクを張りた...
-
重複するものを消したい
-
XSLTがブラウザで表示されません。
-
うまく表示されない
-
文字列の取得
-
xsl:param要素をxsl:templateの...
-
value-ofの値を属性値とするには
-
XMLをXSLを使いHTMLに変換した...
-
XMLから指定テキストのみを抜き...
-
ある文字列を含むノードが存在...
-
VBAからxml・スタイルシートを...
-
xsl、xpath式の書き方について
-
XSLで特定のタグだけを出力する...
-
XSL内でJavaScriptを記述し、Ja...
-
XSLTで直下のテキストのみ取得...
おすすめ情報