• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:javascriptからxsltに値を渡したい)

javascriptからxsltに値を渡したい

このQ&Aのポイント
  • javascriptからxsltに値を渡したいと考え、設定してみているがうまく参照できず、解決法を求めている
  • 環境は、FireFox3.5を使用しており、FireFoxで動作することを前提としている
  • xmlファイルとxsltファイルを読み込み、XSLTプロセッサを作成し、値を渡したいがうまくいっていない

質問者が選んだベストアンサー

  • ベストアンサー
  • Chaire
  • ベストアンサー率60% (79/130)
回答No.2

XSLT 1.0 規定(邦訳)11.4 節より: | トップレベルに置く xsl:param エレメントでは、スタイルシートに渡すパラメータを宣言する。XSLT では、パラメータをスタイルシートに渡すためのメカニズムを定義しない。 トップレベルでの宣言なしに外部パラメータを受け取れるプロセッサを、私は知りません(あるのかもしれませんが)。 それと念のため、<param name="p1" select="0"/> と <param name="p2">0</param> は全くの別物です。前者は数値の 0 ですが、後者は <dummy>0</dummy> のような結果ツリー断片であり、型変換においてノードセットと同じように扱われます。例えば、boolean($p1) は false ですが、boolean($p2) は true です。

参考URL:
http://www.infoteria.com/jp/contents/xml-data/REC-xslt-19991116-jpn.htm#top-level-variables
taku0
質問者

お礼

再度の詳しいご解説およびご教授を頂きましてありがとうございます。 xsl:paramについては、テンプレート内で、値を受け取る際の変数宣言としてのイメージでしか使っていなかった為、xsl:paramの本来の使い方を忘れていました。 トップレベル以下に、グローバル変数としての宣言が必要という事だったのですね。 後、ご解説内容の ><param name="p1" select="0"/> と <param name="p2">0</param> は全くの別物です。前者は数値の 0 ですが、後者は <dummy>0</dummy> のような結果ツリー断片であり、型変換においてノードセットと同じように扱われます。例えば、boolean($p1) は false ですが、boolean($p2) は true です。 についてですが、 xsl:param(xsl書式)の基本な記述方法として ・<xsl:param name="変数名"/> ・<xsl:param name="変数名" select="式"/> ・<xsl:param name="変数名" select="式"></xsl:param> ・<xsl:param name="変数名">処理されると変数値になる、テンプレートの内容</xsl:param> 例)<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:param name="変数名1"> <shop>...</shop> <area>...</area> </xsl:param> <xsl:param name="変数名2"> <shop>...</shop> <area>...</area> </xsl:param> ... が、あげられると思いますが、javaやphp等のプログラム言語で判断される際のお話ですよね? <xsl:call-template name="myStyle"> <xsl:with-param name="param1">silver</xsl:with-param> <xsl:with-param name="param2">black</xsl:with-param> </xsl:call-template> <xsl:template name="myStyle"> <xsl:param name="param1">white</xsl:param> <xsl:param name="param2">white</xsl:param> ここで変数宣言しているparam1やparam2の値を上書きして使ってます。 </xsl:template> ※先の、「型変換においてノードセットと同じように扱われます。」とおっしゃるのは、話が違うように感じてしまいます。 下記で、 >@select 属性に、値が渡されなかったときのデフォルト値を書くこともできます。 と、教わり ><param name="p1" select="0"/> と <param name="p2">0</param> は全くの別物です。 と、お教え頂き、 xsl:param(xsl書式)の基本な記述方法としての先の例による記述で、現状問題なく使えている事から、少し気になりましたので・・・。 お手数ですが、もし、この点についての自分の誤解に関するご説明など、お教え頂けませんでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Chaire
  • ベストアンサー率60% (79/130)
回答No.4

No.2 お礼の内容に関して。XSLT 1.0 規定の 11.2 節にもありますが、 <xsl:param name="n" select="2"/> <xsl:value-of select="child::HOGE[$n]"> 上記は 2 番目の子 HOGE 要素の文字列値を出力するのに対し、 <xsl:param name="n">2</xsl:param> <xsl:value-of select="child::HOGE[$n]"> こちらは 1 番目の子 HOGE 要素の文字列値を出力します。なぜでしょうか? 後者の $n は <dummy>2</dummy> のような断片だからです(DOM で言う DocumentFragment)。XPath 1.0 規定 2.4 節によれば、述語式 [...] の中身は、数値以外であればブール値変換されるとあります。後者の $n は数値ではないのでブール値変換されますが、このときの変換規則はノード集合の規則にしたがいます。すなわち、ノード集合が空でなければ true です。ゆえに、child::HOGE[$n] は child::HOGE[true()] となり、全ての子 HOGE 要素を返します。 さらに、value-of 要素の select 属性は、評価結果を string() 関数を適用したかのように文字列に変換します(XSLT 1.0: 7.6.1 節)。string() 関数にノード集合を渡した場合、文書出現順で最初のノードの文字列値を返します(XPath 1.0: 4.2)。 だから、上のような結果になるわけです。これは XSLT 1.0/XPath 1.0 の規則であり、Java や PHP のような外部プログラムとは全く関係ありません。XSLT は暗黙の型変換が異常なほど多く、誤りのもとになるので、可能ならばいちいち string()、number()、boolean() を書いて型変換を明示した方が良いくらいです。 XSLT 1.0 の結果ツリー断片は極めて使い勝手が悪く(XSLT 2.0 で少し改善されました)、多くの場合は XPath 1.0 の基本データ型(数値、文字列、ブール値、ノード集合)を渡したいのでしょうから、私は param 要素についても select 属性の方を勧めたわけです。

taku0
質問者

お礼

ご教授ありがとうございます。 xsltの型変換を考えてのアドバイスだったのですね。 暗黙的に型変換され、その際の変換規則の実例まで分かりやすくお教え頂いたこと、 また、URLのご掲示と詳細な節箇所までお教え頂き、とても参考になります。 今回は、色々とお教えいただき、本当にありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。
  • Chaire
  • ベストアンサー率60% (79/130)
回答No.3

なお、具体的なエラーメッセージが書かれていませんので見落としていましたが(すみません)、エラーの直接の原因は param 要素の位置です。テンプレート内に置く param 要素は、あらゆる要素の先頭でなければなりません。とはいえ、外部パラメータを受け取る param 要素はテンプレートの外に置く、というのは前述の通りです。 ついでながら、結果 HTML 断片における id 属性が数値のみで構成されており、かつ空白が入っていること、あるいは元 HTML 文書に DOCTYPE 宣言がない(文法的に必須で、レンダリングやスクリプトエンジンを含むブラウザの振る舞いを切り替えます)など、HTML の文法にも不安点が散見されますので、念のためチェックして下さい。

全文を見る
すると、全ての回答が全文表示されます。
  • Chaire
  • ベストアンサー率60% (79/130)
回答No.1

> xsltp.setParameter ('', "param.num", param.value); > xsltp.setParameter ('', "Num", Num); 受け取り側 XSLT の記述がありません。トップレベルに以下が必要です。 <xsl:param name="param.num"/> <xsl:param name="Num"/> @select 属性に、値が渡されなかったときのデフォルト値を書くこともできます。コマンドラインなどからパラメータを受け取るときにも使いますので、覚えて下さい。値は原則として文字列として送られますが、一部のプロセッサでは数値などをそのまま渡すものもあります。

taku0
質問者

お礼

ご教授ありがとうございます。 既に、 <xsl:param name="param.num">0</xsl:param> <xsl:param name="Num">0</xsl:param> を記述し、何度もテスト行ってみたのですが、エラーとなってしまうようです。 トップレベルに以下が必要です。との事ですが、xsltにおいて、本来 <xsl:param name="・・・"/> の指定はしなくとも特に問題ないはずと思いましたが・・・ もし正常な動作を確認可能なようでしたら、またご教授頂けますようお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • xml+xslでの変換内容をtextareaへ

    お世話になります。 xml+xslでhtmlに変換する際、その変換内容をtextareaにも表示させるようにしたいのです。 使用ブラウザ:FireFox。現状はFirebugでDOMツリーを手動で参照してる状況です。 現在は、ノードをtextareaに表示しようとすると[object DocumentFragment]とだけ出てしまい、DocumentFragmentという概念あることは分かり、色々調べcreateElement()やcreateTextNode()など、その他思いつく限りの事でテストしてみてるのですが、どうにもノードをHTMLタグとしてtextareaに表示させる事が出来ません。 以下にポイントとなるソースを掲示しますので、どなた様か、お助け願えませんでしょうか --test.html---- <html><head> <meta content="text/html; charset=utf8" http-equiv="content-type"> <title>JS+xslt</title> <script type="text/javascript"> function tramsformlists(xmlFile, xslFile, resultNodeID){ var xml, xslt, newDoc; if(document.all){ xml = new ActiveXObject("Microsoft.XMLDOM"); xslt = new ActiveXObject("Microsoft.XMLDOM"); }else { xml = document.implementation.createDocument("", "", null); xslt = document.implementation.createDocument("", "", null); } xml.async = false; xslt.async = false; xml.load(xmlFile); xslt.load(xslFile); if(document.all){ document.getElementById(resultNodeID).innerHTML = xml.transformNode(xslt); }else { var xsltp = new XSLTProcessor(); xsltp.importStylesheet(xslt); newDoc = xsltp.transformToFragment(xml, window.document); var df = document.createDocumentFragment(); cloneDoc= newDoc.cloneNode(true); document.getElementById("Div"+resultNodeID).innerHTML = ""; document.getElementById("Div"+resultNodeID).appendChild(newDoc); t = document.msg_form.TextareaTest.value; document.msg_form.TextareaTest.value =t + df.appendChild(cloneDoc); } } </script> </head><body> <form name="msg_form"> <ul> <li> <input type="button" value="Menu" onclick="tramsformlists('test0.xml','test0.xsl','Test')"><br> <div id="DivTest"></div> <textarea cols="50" rows="10" id="TextareaTest">あああああああ</textarea> </li> </ul> </form> </body></html> --test0.xml-- <?xml version="1.0" encoding="utf-8"?> <root> <nolink_logo> </nolink_logo> </root> --test0.xsl-- <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="utf-8"/> <xsl:template match="root"> <xsl:apply-templates select="nolink_logo"/> </xsl:template> <xsl:template match="nolink_logo"> <xsl:call-template name="Test" /> </xsl:template> <xsl:template name="Test"> <xsl:variable name="menu" select="document('test1.xml')/root"/> <div>画像を表示 <xsl:for-each select="$menu"> <xsl:element name="a"> <xsl:attribute name="href"> <xsl:value-of select="url[1]"/> </xsl:attribute> <xsl:attribute name="target">_blank</xsl:attribute> <xsl:element name="img"> <xsl:attribute name="src"> <xsl:value-of select="img[1]"/> </xsl:attribute> </xsl:element> </xsl:element> </xsl:for-each> </div> </xsl:template> </xsl:stylesheet> --test1.xml-- <?xml version="1.0" encoding="utf-8"?> <root> <img>http://domain/image2.gif</img> <url>http://domain/test.html</url> </root>

  • XMLの実体参照とXSLT

    次のようなXMLファイルをXSLTで処理したいのですが、&baseの部分がうまく表示できません。 どのようにしたら表示できるでしょうか? ■a.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="a.xsl"?> <!DOCTYPE test [ <!ELEMENT name (#PCDATA)> <!ENTITY base SYSTEM "base.xml"> ]> <test> <name>abc</name> &base; </test> ■base.xml <?xml version="1.0" encoding="UTF-8"?> <base>base</base> ■a.xsl <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="UTF-8" /> <xsl:template match="/"> <xsl:apply-templates select="test" /> <xsl:apply-templates select="base" /> </xsl:template> <xsl:template match="test"> name:<xsl:value-of select="name" /> </xsl:template> <xsl:template match="base"> base:<xsl:value-of select="base" /> </xsl:template> </xsl:stylesheet> □結果 name:abc ※base.xmlの内容を表示できない

    • ベストアンサー
    • XML
  • XSLT

    いつもお世話になっております。 次のXSLTの結果がどうしてそうなるのかわからないので教えてください。 解説には、「処理は必ずルートノードのテンプレートから始まります」と書いてあるんですが、できましたら、その辺もからめて、どういう処理の流れになるのか、カレントノードがどう移動していくのか、教えていただけると助かります。 (XML) <?xml version="1.0" encoding="Shift_JIS"?> <Conference Situation="Reserved" Equipment="Projector">  <Room>会議室</Room>  <User>山田太郎   <Date>2008/05/08</Date>   <Time>10:00-12:00</Time>  </User>  <Number>4名</Number> </Conference> (XSLT) <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  <xsl:output method="text" />  <xsl:template match="/Conference">   <xsl:value-of select="Number" />  </xsl:template>  <xsl:template match="Conference/User">   <xsl:value-of select="Date" />  </xsl:template>  <xsl:template match="/">   <xsl:value-of select="Conference/Room" />  </xsl:template> </xsl:stylesheet> (結果) 会議室

    • ベストアンサー
    • 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
  • XSLTの記述方法

    お世話になります。 XML+XSLTで開発しております。 XSLTの記述方法でjavascriptの引数にXMLデータを挿入する記述は どうすればよいのでしょうか? すごい初歩的な質問かもしれませんが ご教授よろしくお願いいたします。 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <table> <tr> <td > <a href="#" onClick="hogehoge('pram')">hogehoge rink </a> </td> </tr> </table> </xsl:template> </xsl:stylesheet> ↓↓↓↓↓↓こんな感じにしたい↓↓↓↓↓↓ <a href="#" onClick="hogehoge('<xsl:value-of select="$prm_test"/>')">りんく</a>

    • ベストアンサー
    • XML
  • Firefox・GoogleChromeでのxslt読み込み

    Firefox・GoogleChromeでのxslt読み込み 現在、xml + xsltでhtmlを生成する試験をしているのですが、 Firefox・GoogleChromeで意図通りの結果にならず悩んでおります。 ソースは下記の通りなのですが、何かアドバイスをいただけたら助かります。 test.xmlとtest.xslを下記のようなフォルダ構成で配置する。 【フォルダ構成】 project |-xml | |-test.xml |-xsl |-test.xsl 【ソース】 test.xml <?xml version = "1.0" encoding = "utf-8"?> <?xml-stylesheet type = "text/xsl" href = "../xsl/test.xsl"?> <tests name = "test"> <test> <tag>aaa</tag> </test> <test> <tag>bbb</tag> </test> <test> <tag>ccc</tag> </test> </tests> test.xsl <?xml version = "1.0" encoding = "utf-8" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method = "html" encoding = "utf-8" doctype-system = "string" media-type = "text/xml" /> <xsl:template match="/"> <html lang = "ja-JP"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <title><xsl:value-of select = "tests/@name" /></title> </head> <body> <xsl:apply-templates /> </body> </html> </xsl:template> <xsl:template match = "test"> <div> <xsl:value-of select = "tag" /> </div> </xsl:template> </xsl:stylesheet> 【結果】 ・IE・Safari・Opera -> ちゃんと表示してくれる ・Firefox(Ver3.5.3) -> NG   ->・ページタイトル反映されない    ・tagの中身("aaa"・"bbb"・"ccc")が一行に表示されてしまう ・Google Chrome(Ver5.0.342.8 beta) -> NG   ->・何も表示されず、画面真っ白    ・デベロッパーツールでは、"Unsafe attempt to load URL・・・"とエラーが出ている 【備考】 ・『Mozilla で扱えるMIMEタイプは、IEより厳密』みたいな記述を見つけたので、 test.xslの3行目に呪文みたいなのを見よう見真似で書いてみたのですが、 効果なし。というか、この記述があってるのかも分からない。。。 ・Firefoxの場合、同じフォルダにtest.xmlとtest.xslを配置すると ちゃんと表示してくれる。 長々となってしまいましたが、よろしくお願いします。

    • 締切済み
    • XML
  • XSLTの動作

    いつもお世話になります。 以下のXSLTの処理の動き方を教えてください。 どうして3の結果xmlになるのかわかりません。おそらくposition()の取り方がわかっていないのかなって思っています。 自分としては <answer>  <色>白</色>  <色>yellow</色>  <色>赤</色>  <色>blue</色>  <色>黒</色> </answer> になるんじゃないのかなって思ってしまうのですが・・・。 (1)データ <?xml version="1.0" encoding="Shift_JIS"?> <color_pencil>  <price>1300</price>  <color><en>white</en><jp>白</jp>  <color><en>yellow</en><jp>黄色</jp>  <color><en>red</en><jp>赤</jp>  <color><en>blue</en><jp>青</jp>  <color><en>black</en><jp>黒</jp> </color_pencil> (2)XSLT <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/">  <answer>   <for-each select="color_pencil/color">    <xsl:choose>     <xsl:when test="position() mod 2=0">      <xsl:apply-templates select="." />     </xsl:when>     <xsl:otherwise>      <xsl:call-template name="color" />     </xsl:otherwise>    </xsl:choose>   </xsl:for-each>  </answer> </xsl:template>  <xsl:template match="color">   <色><xsl:value-of select="jp" /></色>  </xsl:template>  <xsl:template name="color">   <色><xsl:value-of select="en" /></色>  <xsl:template> </xsl:stylesheet> (3)結果xml <answer>  <色>white</色>  <色>黄色</色>  <色>red</色>  <色>青</色>  <色>black</色> </answer>

    • ベストアンサー
    • XML
  • XSLTの記述方法

    XSLTで次のような形の記載をしたいのですが、可能でしょうか? content属性内に、タグを入れたいのですが、エラーになってしまいます。 よろしくお願いします。 XSLT <meta><xsl:attribute name="content">1<br>2<br>3</xsl:attribute></meta> ↓  変換 XHTML(↓という形にしたい) <meta content="1<br>2<br>3"/> 【エラー】 終了タグ 'xsl:attribute' が開始タグ 'br' と一致していません。リソース 'file:///xxx.xsl' の実行エラーです... <meta><xsl:attribute name="content">1<br>2<br>3</xsl:attribute></meta> 環境:WinXP+IE7

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

    入力となるXMLの要素Aに属性が複数存在した場合に、ある属性以外のすべての属性を要素Bに付与して出力したいのですがどのようなXSLTで記述すればいいのでしょうか? 入力例) <sample> <要素 aa="1" bb="2" cc="3">AAAAAAA</要素> </sample> 出力例) <sample> <youso bb="2">AAAAA</youso> </sample> XSLT) <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/ 1999/XSL/Transform" version="1.0"> <xsl:template match="/">   <sample> <xsl:apply-templates/> </sample> </xsl:template> <xsl:template match="要素"> <xsl:copy> <!-- <xsl:copy-of select="@*"/> -->☆ </xsl:copy> </xsl:template> </xsl:stylesheet>

    • 締切済み
    • XML
  • スマートなxsltの記述方法

    xml→xmlを行うxsltの記述方法で質問があります。 元のxmlの例を下に示します。 <?xml version="1.0" encoding="Shift_JIS" ?> <root> <A1> <B1> <DATA1>aaa</DATA1> <DATA2>bbb</DATA2> </B1> </A1> <A2> <DATA3>ccc</DATA3> <DATA4>ddd</DATA4> <B2> <DATA5>eee</DATA5> <C1> <DATA6>fff</DATA6> </C1> <DATA7>ggg</DATA7> </B2> </A2> <DATA8>hhh</DATA8> </root> (実際はDATA1,DATA2のような規則的な要素名ではありません) 変換後のxmlとしては <root> <DATA1>aaa</DATA1> <DATA2>bbb</DATA2>       ・       ・       ・ <DATA8>hhh</DATA8> </root> のように、値を持っている要素だけを、ルートノードの下に記述したものが欲しいのです。 作った物としては、  <xsl:template match="DATA1" >   <xsl:copy>    <xsl:value-of select="." />  </xsl:copy>  </xsl:template> このようなtemplateをDATA1-8まで記述するものです。 何か簡潔な記述方法はないでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • XML