• 締切済み

Document関数とPosition関数について

みなさんよろしくおねがいします。 早速ですが、 ソース"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"を作り、変換したところ、問題なく正常に表記されました。 ヒントなどでも結構です、問題点の御指摘 よろしくおねがいします。

  • XML
  • 回答数3
  • ありがとう数12

みんなの回答

回答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として扱うことができました。 違うのであれば違う点を補足しておっしゃってください。考え直してきます。 #少し冗長なのは私の思考力の無さが原因です

goodber
質問者

お礼

わざわざありがとうございます。 また、説明不足で申し訳ありませんでした。 経緯を説明しますと、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関数の使い方が悪いのか というのが見当がつかず、このようなわかり辛い質問になってしまいました。 たいへんありがたいご回答ですが、今現在検証する環境がないので、 検証後、改めてまたお礼に参ります。 ありがとうございました

  • kotsuden
  • ベストアンサー率0% (0/0)
回答No.1

すみません 質問者の別IDです。 追加で書き込もうとしましたが、誰かの返信という形で無いと 追加できないようなので、先ほど別IDをとってきました。 その他の補足説明が文章が長くて書ききれませんでした。 以下に続きます

goodber
質問者

補足

追加です。 ** 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

  • xslのdocument関数で読込んだ2つのxmlをxsl:sortしたい

    次のXSLで動作させています。 <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xml:space="default" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <xsl:output method="text" /> <xsl:template match="/"> <xsl:for-each select="document('取り込むXMLファイル')//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> <xsl:for-each select="//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> </xsl:template> </xsl:stylesheet> ここまでは出来たのですが、xsl:sortでまとめてsortするにはどうすればいいのでしょうか?

    • ベストアンサー
    • XML
  • xpathでノードのポジションを得る

    position()でポジションを取得したいのですが、 <xsl:apply-templates select="//test[position()]" /> のようなかんじにしてtestノードのposition()リストを 取得するようなことはできないのでしょうか。 まあ、 <xsl:template match="test"> <xsl:value-of select="position()" /> </xsl:template> こういうテンプレートつくれば結果的に取れると思うんですが、 今回はこれはなしでお願いします。 xpathだけでpositionをしゅとくできないものでしょうか。

    • ベストアンサー
    • XML
  • xsl positionで…

    <goo> <name> <first>太郎</first> <last>田中</last> </name> <name> <first>次郎</first> <last>佐藤</last> </name> </goo> このような xml より、 <xsl:value-of select="//name[position() = 2]" /> とすると、"次郎 佐藤" となるのですが、個別に"次郎"だけを取得出来る方法はありますか? <xsl:template match="name"> <xsl:if test="position() = 2"> <xsl:value-of select="first"/> </xsl:if> </xsl:template> この方法を使用しないで解決したいと思っています。 いろいろ試してるのですが、うまく行きません…。 回答、よろしくお願いします。

    • ベストアンサー
    • XML
  • XSLTでtest.xmlファイルのccc要素の値を取得する場合は以下

    XSLTでtest.xmlファイルのccc要素の値を取得する場合は以下(1)、(2)のようにやればいいのですが、(2)の箇所のパス(testを)動的(可変)にすることはできるのでしょうか? (1)document関数によりxmlファイルを変数に格納  <xsl:variable name="aaa" select="document('test.xml')"/> (2)上記変数からパスを指定して値を取得  <xsl:variable name="bbb" select="$aaa/test/ccc"/> test.xml <test> <ccc>bbb</ccc> </test> 例)以下は間違ってると思いますがパスに変数を使用して値を取得することは可能でしょうか?   <xsl:variable name="ccc" select="'test'"/> // 変数cccにtestという文字列を格納   <xsl:variable name="bbb" select="$aaa/$ccc/ccc"/> //test/cccがパスのつもり

    • 締切済み
    • XML
  • XML/XSLでテンプレートの適用がうまくいかない

    同じツリーの深さで異なる要素名のノードがあるXMLだと期待通りにテンプレートが適用できない という問題に付き当たっています。 例えば    / +------+ poem  poem のような構成だとmatch=poem、value-of select="text"などで各poemの歌詞を表示させることが できます。 一方、以下の構成で同じ事をやろうとすると各poemの歌詞に加えてyearのnumのValueまで 列挙されてしまいます。poemの中身だけ出すにはどうすればよいでしょうか? 以下に例を書きます。     / +--------------+ list         year +------+      +----+ poem poem    Num Num 例えば以下のURLなどを参照してやっております。 http://www6.airnet.ne.jp/manyo/xml/xslt/step15.html XSLはこんな感じです。 <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="poem"> <tr> <td><xsl:value-of select="poet" /></td> <td><xsl:value-of select="yomi" /></td> </tr> <br /> </xsl:template> 手持ちのXMLを変換したく、その勉強のため上記のような構成のXMLを扱う方法を 知りたいと思っています。 よろしくお願いします。

    • 締切済み
    • XML
  • XSL内でJavaScriptを記述し、JavaScript内でXMLデータを取得するには・・・

    大変困っていますのでよろしくお願いします。 XSLのファイル内でJavaScriptを記述し、JavaScriptでxmlの要素を取得操作したいのですが、とり方がわかりません。 ご教授のほどをよろしくお願いします。 ================================================================== sample.xsl ------------------------------------------------------------------ <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>XML: 基本サンプル</title> </head> <body> <p align="center">サンプル</p> <xsl:apply-templates select="information/value/applicationinfo" /> </body> </html> </xsl:template> <xsl:template match="value/applicationinfo"> <Script Language = "JavaScript"> <xsl:comment> <![CDATA[ document.write("<xsl:value-of select=\"componentname\" />"); ]]> </xsl:comment> </Script> <table border="1"> <tr> <td><xsl:value-of select="componentname" /></td> </tr> </table> </xsl:template> </xsl:stylesheet> ================================================================== 下のテーブルでは要素を表示することはできます。 このやり方では駄目なのでしょうか?

    • ベストアンサー
    • XML
  • XSLのifがいまいち理解ができなく。

    if文をどうやればいいのかで悩んでしまいに詰まっている状態です。 URLがない場合は何も表示しないにしたいのですが、参考ページを見ても全くわからない状態。 test.xsl <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet> <xsl:template match="/"> <xsl:apply-templates select="page/message"/> </xsl:template> <xsl:template match="page/message"> <table> <tr> <td>名前</td> <td><xsl:value-of select="name"/></td> </tr> <tr> <td>URL</td> <td><a><xsl:attribute name="href"><xsl:value-of select="@url" /></xsl:attribute><xsl:attribute name="target">_blank</xsl:attribute><xsl:value-of select="@url" /></a></td> </tr> </table> </xsl:template> </xsl:stylesheet> xml <?xml version="1.0" encoding="utf-8"?> <page> <message url="http://yahoo.co.jp"><name>山田太郎</name></message> <message url=""><name>山田花子</name></message> </page>

    • ベストアンサー
    • XML
  • tableを3段組みにしてsortをかけたい

    下記のxsltによってtableを3段組にしています。 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <title>test</title> <body> <table border="1"> <xsl:apply-templates select="cate/tea/name[position() mod 3 = 1]"/> </table> </body> </html> </xsl:template> <xsl:template match="cate/tea/name"> <tr> <td><xsl:value-of select="."/></td> <td><xsl:value-of select="following-sibling::name[1]"/></td> <td><xsl:value-of select="following-sibling::name[2]"/></td> </tr> </xsl:template> </xsl:stylesheet> こんな感じの出力です。 <table> <tr> <td>あかぎ</td> <td>さとみ</td> <td>ゆめお</td> </tr> <tr> <td>かさお</td> <td>らの</td> <td>でお</td> </tr> 省略 </table> xmlは下記です。 <cate> <tea> <name>あかぎ</name> <name>さとみ</name> <name>ゆめお</name> <name>かさお</name> <name>らの</name> <name>でお</name> <name>くる</name> <name>もも</name> <name>しょう</name> <name>さめお</name> <name>たさお</name> <name>うらの</name> <name>こでお</name> <name>さくる</name> <name>れもも</name> <name>きょう</name> </tea> </cate> この3段組みをしたまま、 nameを名前順にソートしたいのですが、 うまくいきません。 あかぎ、かさお、くる、といった左の列内だけで、 ソートされてしまい、次にそれぞれの後続の兄弟ノードが、 真ん中の列にでてしまいます。 ちゃんと、xmlデータ順(あかぎ、さとみ、ゆめお、かさお・・・)に3段組みを表現したいのですが、 無理なのでしょうか。 どなたかご協力お願いします。

    • ベストアンサー
    • XML
  • xmlから吐き出したhtmlデータのソースインデントがきかない

    xmlとxsltを使って、htmlを吐き出しているのですが、 <xsl:output indent="yes"/> indent="yes"を入れてもindentされません。 xsltは下記になります。 <?xml version="1.0" encoding="shift_jis"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="id" /> <xsl:output method="xml" standalone="yes" encoding="Shift_JIS" omit-xml-declaration="yes" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" indent="yes" /> <xsl:template match="/"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>KDS</title> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" /> <link rel="stylesheet" href="/css/style.css" type="text/css" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <script type="text/javascript" src="/js/snavi_case.js"><xsl:comment>//</xsl:comment></script> </head> <body> <xsl:apply-templates select="info/group/page[@fileId='pteach' and @fileId = $id]" mode="main"/> </body> </html> </xsl:template> <xsl:template match="info/group/page" mode="main"> <xsl:value-of select="title"/> <table width="539" border="1"> <xsl:apply-templates select="teacher[position() mod 3 = 1]"/> </table> </xsl:template> <xsl:template match="teacher"> <tr> <td><xsl:value-of select="name"/>:<xsl:value-of select="subject"/></td> <td><xsl:value-of select="following-sibling::teacher[1]/name"/>:<xsl:value-of select="following-sibling::teacher[1]/subject"/></td> <td><xsl:value-of select="following-sibling::teacher[2]/name"/>:<xsl:value-of select="following-sibling::teacher[2]/subject"/></td> </tr> </xsl:template> </xsl:stylesheet> ただ、<html>~<body>と</body>~</html>はしっかりとソースがインデントされるのですが、<xsl:apply-templates select="info/group/page[@fileId='pteach' and @fileId = $id]" mode="main"/>で読み込んだところ以降のindentが全くきいていないようです。 こんな感じになります。 <html> <title></title> <body>#ここまではindentは正常 <table><tr><td></td></tr><tr><td></td></tr><tr><td></td></tr><tr><td></td></tr><tr><td></td></tr><tr><td></td></tr><tr><td></td></tr><tr><td></td></tr><tr><td></td></tr><tr><td></td></tr></table> #indentが効いていない! </body> </html> どなたか同じような状況になられた方、 いらっしゃいませんでしょうか。

    • ベストアンサー
    • XML
  • XSLT変換について

    以下のようにファイルを作成してみました。 ローカルではIEに表示できるのですが,アップすると表示されず「スタイルシートにドキュメント要素が含まれていません。スタイルシートが空であるか、正しく構成された XMLドキュメントでない可能性があります。」というコメントが出ます。ご存知の方いらっしゃいましたらどうか教えてください。 ↓作成したファイル 「top.xml」(省略) 「top.xsl」 <?xml version="1.0" encoding="Shift_JIS" ?> <xsl:stylesheet xmlns:xsl="(省略)" version="1.0"> <xsl:import href="./note.xsl" /> <xsl:output method="html" encoding="Shift_JIS" /> <xsl:template match="/">  <html xmlns="(省略)" xml:lang="ja" lang="ja">  <head>   <meta http-equiv="Content-Type"    content="text/html; charset=Shift_JIS" />   <title><xsl:value-of   select="/top/title" /></title>  </head>  <body>   <xsl:call-template name="header" />   <div align="center"><h1>HOME PAGE</h1></div>   <table> <tr><th>CONTENTS</th></tr> <xsl:for-each select="/top/contents"> <tr><th><a href="{url}"><xsl:value-of      select="label" /></a></th>      <td><small><xsl:value-of      select="text" /></small></td></tr> </xsl:for-each>   </table><br />   <xsl:call-template name="footer" />  </body>  </html> </xsl:template> </xsl:stylesheet> 「note.xsl」(top.xslにおけるxsl:importをコメントアウトしても結果は変わらなかったため,記載省略。)

    • 締切済み
    • XML