お世話になります。
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>
No.1ベストアンサー
- 回答日時:
使用ブラウザが Firefox(および Opera、Safari)であるなら、以下だけで十分です。
var doc = document;
var impl = doc.implementation;
var xml = impl.createDocument("", "", null);
xml.async = false;
xml.load(xmlFile);
var xslt = impl.createDocument("", "", null);
xslt.async = false;
xslt.load(xslFile);
var xsltp = new XSLTProcessor();
xsltp.importStylesheet(xslt);
var df = xsltp.transformToFragment(xml, doc);
var t1 = doc.forms["msg_form"].elements["TextareaTest"];
t1.value += (new XMLSerializer).serializeToString(df);
var t2 = doc.getElementById("Div"+resultNodeID);
t2.innerHTML = "";
t2.appendChild(doc.importNode(df, true));
ポイントは XMLSerializer、ついでに importNode です。
---
IE を含めるなら、Windows 2000 を使っているのでなければ、もう "Microsoft" のを使わないで下さい(廃止されています)。また、document.all での分岐は禁物です(これはもともと非常にマズいやり方で、しかもあまりに広まってしまったので、他のブラウザも分岐を通すようになったからです)。
try {
var xml = new ActiveXObject("Msxml2.DOMDocument.3.0");
xml.async = false;
xml.load(xmlFile);
var xslt = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.3.0");
xslt.async = false;
xslt.load(xslFile);
...
} catch (err) { ... }
なお、ここでは MSXML 3.0 を使いましたが、importNode を使いたければ 6.0 を使う必要があります。バージョンを省略すると必ず 3.0 が呼び出されますので、使い分けて下さい。
ご教授頂きありがとうございます!
importNodeで元のノードのクローンを作り
XMLSerializerでDOMをテキストに変換すると言う事ですか。
素晴らしいです!
分からない事が分かってきて出来ない事が出来てくるって良いですね。
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ActiveXobjectが作成できない
-
任意の座標をクリックさせるには
-
javascriptでスロットゲームを...
-
javascript 特定のタグのidの存...
-
<a>タグのテキストを取得
-
onchangeイベントを使ってspan...
-
innerHTML実行後のイベント
-
Click回数を数え、規定された回...
-
DIV内のDIV要素を移動する。
-
重複しないくじの作り方がわか...
-
画像上のクリックした場所が分...
-
HTML:Tableタグに対し、JavaScr...
-
モーダルダイアログウィンドウ...
-
JavaScriptで決まった「時刻」...
-
C#テキストボックスの文字を配...
-
Boolean型配列中のTrueの有無を...
-
google apps scriptの終了のさせ方
-
関数でy=g(x)のgとは何の略です...
-
jspからjavascriptの変数引継ぎ
-
Linux バイナリ実行できない "...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<a>タグのテキストを取得
-
[初心者]javascriptのfor文でな...
-
ActiveXobjectが作成できない
-
任意の座標をクリックさせるには
-
appendChildがieだとできない??
-
onchangeイベントを使ってspan...
-
【Tabキー】特定の範囲内だけで...
-
モーダルダイアログウィンドウ...
-
javascript 特定のタグのidの存...
-
日本語入力の禁止
-
innerHTML実行後のイベント
-
HTML:Tableタグに対し、JavaScr...
-
onclickを使わずにイベント処理...
-
アンカークリックのイベントを...
-
javascriptでスロットゲームを...
-
画像上のクリックした場所が分...
-
javascriptでCSVを呼出しvlookup
-
javascriptで編集可能不可能の...
-
Click回数を数え、規定された回...
-
子画面からwindow.openを開いた...
おすすめ情報