• 締切済み
  • 困ってます

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

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数145
  • ありがとう数12

みんなの回答

  • 回答No.3

ちと訂正 【誤】 ====================b.xml====================== 【正】 ====================b.xsl======================

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 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
  • 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
  • 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
  • 回答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

  • 違う階層のテンプレートの変数を参照する方法を教えてください。

    以下のようにテンプレートAAAにある$naをテンプレートBBBから参照し、変数$nbをつくりたいと思っております。 いろいろと試して四苦八苦しております。 XSL初心者です、どなたかご教示願います。 ----------------------------------------------- <xsl:template match="AAA">  <xsl:variable name="na"><xsl:value-of select='@value' /></xsl:variable> </xsl:template> <xsl:template match="BBB"> <xsl:variable name="nb"><xsl:value-of select="$na" /></xsl:variable> </xsl:template>

    • ベストアンサー
    • XML
  • XSL : 変数について

    XSL : 変数について 初めて質問致します。 ご教示宜しくお願い致します。 ****** XML文書 ****** <root> <A>1</A> <B> <B_1>2</B_1> <B_2>3</B_2> </B> </root> ****** 質問 ****** xsl で、上記xml文書の<B>タグ配下 <B_1>2</B_1> <B_2>3</B_2> を変数に代入するにはどのようにすれば いいでしょうか?(タグ名も含めて) 下記の2つを試してみましたが、 いずれも 「2 3」となります。 ・ <xsl:variable name="hoo" select="B"/> ・<xsl:variable name="hoo"> <xsl:copy-of select="B"> </xsl:variable> 質問に不明瞭な点がありましたら ご指摘下さい。 宜しくお願い致します。

    • 締切済み
    • XML
  • XSLTでの外部XMLファイルの読み込みについて。

    XSLTについて質問がございます。 下記のように、document関数を用いて外部のxmlを取り込んでいるのですが、 もし、そのxmlファイルが存在しなかった場合はエラーとなってしまいます。 この時、対象のxmlファイルが存在するか否かを、XSLTで調べる事は可能なのでしょうか? boolean関数を用いてみたりしたのですが、ファイルがない場合はやっぱりエラーになってしまいます。 どなたかご教授願います。 <!-- STYLESHEET --> <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:import href="xsl1.xsl"/> <xsl:param name="doc" select="document('../XML/import.xml')"/> </xsl:stylesheet>

    • ベストアンサー
    • XML
  • xsl:variableでの抽出条件の変更

    こんにちは、Khazadと申します。  xsl:variableで、xsl:apply-templates の抽出条件を変更したくて 下記のようなXSLを作成したのですが、うまくいきません。  原因がわかる方。または別の方法があればご教授お願いできないでしょうか?  パーサーはMSXML3.0です。 (試したこと) 1 テンプレート内に<xsl:value-of select='$frid'/>を挿入すると、   ちゃんと1が表示されます。 2 [@rid='{$frid}']の部分を[@rid='$frid']に変更しても抽出は   行われません。 3 [@rid='{$frid}']の部分を[@rid='1']にすると抽出されます。  以下XSLのソースです -------------------------------------------------------- <xsl:variable name = 'frid' select='1' ></xsl:variable> <xsl:template match="/"> <xsl:apply-templates select="ROOT//*[@rid='{$frid}']"/> </xsl:template> <xsl:template match="*[@rid='{$frid}']"> <xsl:apply-templates select="*"/> </xsl:template> --------------------------------------------------------

    • ベストアンサー
    • 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:variable の使用方法

    こんにちは xml,xsl を今日はじめて使う初心者です。 変数を使おうとして下記のようなメッセージが出てしまいます。 >ここではキーワード xsl:variable を使用できません。 どうすればよろしいでしょう? area.xls: <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> (中略) </html> </xsl:template> <xsl:template match="変換結果"> <table align="left" border="1" width="1500" cellspacing="0" cellpadding="0"> <tr> (中略) </tr> <tr> (中略) <xsl:comment>合計 </xsl:comment> <th>数量</th> (中略) </tr> <xsl:variable name="coLor" select="white" /> <xsl:for-each select="row" order-by="+column0"> <tr bgcolor="$coLor"> <td width="200" align="right"> <xsl:value-of select="column0" /> </td> (中略) </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet> ************************************************************* area.xml <?xml version="1.0" encoding="Shift_Jis"?> <?xml-stylesheet type="text/xsl" href="area.xsl" ?> <変換結果> <row row-Num='1'><column0>,4536163880211</column0> (中略) </row> </変換結果>

    • ベストアンサー
    • 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の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
  • xsl:variableについて

    お世話になります。xsl:variableについて質問です。 xsl:elementのnameを動的に指定したく、次のようにしました。 FireFox3 Beta 5にて、innerHTMLをtextareaに貼り付けて確認しました。 xml <testNode>aaa</testNode> xsl <xsl:variable name="el"><xsl:value-of select="name(.)"/></xsl:variable> <xsl:element name="$el">aiueo</xsl:element> こうすると、 aiueo のみ出力されました。希望する出力は <testNode>aiueo<testNode> です。 xsl:variableの使い方が間違っているのでしょうか?先程からずっとこれに悩んでいます。。。 よろしくお願いします。

    • ベストアンサー
    • 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