No.2ベストアンサー
- 回答日時:
No.1 補足より。
ずいぶん古いサンプルコードですが、IE5.5+ で動けば良いのですね? 他のブラウザは考慮外で、ウェブ上ではなく手元で動けば十分なのですね?ならば、次のようなフォームがあるとして(載っていないのでこちらで作りました)、
<form action="#" onsubmit="try { Search (this); } finally { return false; }">
<fieldset>
<legend>検索</legend>
<p><input type="text" name="keywords" value=""></p>
<div id="hyouji"></div>
</fieldset>
</form>
次のように Search() を修正します。xslt.xsl の中身は分かりませんが、そのまま使えるはずです。
function Search (form) {
try {
var srcURI = 'sampAl.xml';
var xslURI = 'xslt.xsl';
var contextNode = form.document.all ('hyouji');
var i;
// 後で使う IE の split() にはバグがあるので、先に処理しておく
var keywordString = form.elements['keywords'].value.
replace (/^\s+|\s+$/g, '').replace (/\s+/g, '\x20');
if (keywordString.length === 0) {
contextNode.innerHTML = '<p>キーワードなし。<\/p>';
return;
}
if (keywordString.indexOf ('"') > -1) {
contextNode.innerHTML = '<p>検索語に二重引用符を含めないで下さい。<\/p>';
return;
}
var keywords = keywordString.split ('\x20');
var keywordCount = keywords.length;
// "Microsoft.XMLDOM" は古いので使わないこと
var srcDoc = new ActiveXObject ('Msxml2.DOMDocument.3.0');
srcDoc.async = false;
srcDoc.setProperty ('SelectionLanguage', 'XPath'); // MSXML 3.0 のため
srcDoc.load (srcURI);
if (srcDoc.parseError.errorCode !== 0) {
contextNode.innerHTML = '<p>データの読み込みに失敗しました。<\/p>';
return;
}
var expr = [ ];
for (i = 0; i < keywordCount; i++) {
expr[expr.length] = 'contains(., "' + keywords[i] + '")';
}
var nodes = srcDoc.selectNodes (
'child::英語 / child::色データ' +
'[ child::英単語 [' + expr.join (' and ')+ ' ]]');
var nodeCount = nodes.length;
if (nodeCount === 0) {
contextNode.innerHTML = '<p>データなし。<\/p>';
return;
}
// XML 宣言は処理命令ではない
var newDoc = new ActiveXObject ('Msxml2.DOMDocument.3.0');
var newRoot;
newDoc.loadXML ('<?xml version="1.0"?><英語 />');
newRoot = newDoc.documentElement;
// MSXML 3.0 を使っているので importNode() がない
for (i = 0; i < nodeCount; i++) {
newRoot.appendChild (nodes[i].cloneNode (true));
}
var xslDoc = new ActiveXObject ('Msxml2.FreeThreadedDOMDocument.3.0');
xslDoc.async = false;
xslDoc.load (xslURI);
if (xslDoc.parseError.errorCode !== 0) {
contextNode.innerHTML = '<p>スタイルシートの読み込みに失敗しました。<\/p>';
return;
}
var xslTemp = new ActiveXObject ('Msxml2.XSLTemplate.3.0');
xslTemp.stylesheet = xslDoc;
var xsltProc = xslTemp.createProcessor ();
xsltProc.input = newDoc;
xsltProc.transform ();
contextNode.innerHTML = xsltProc.output;
}
catch (err) {
throw err;
}
}
この回答への補足
Chaire様
質問者のsuimii_eoです。あれから何度か上記ソースでトライして、無事に検索可能になりました・・!
本当にありがとうございました。
再度の回答、ありがとうございます。
ご指摘の通り、IE+7以上で動き、サーバーを介さずにデータを渡す、ということがしたいのです。
職場にて、ソースをそのまま使用して動かしてみました。結果として「キーワードなし」と「データなし」は表示されるのですが、検索が機能できず・・。ただ、見ていただいたものが古いことを教えていただき、それを踏まえての丁寧な回答をいただき、とても勉強になります。
コードを見ても全然ピンとこない部分もあり、かなりの勉強不足を痛感しています。ここに記していただいたコードを元に、(xPath含め)再度やり直してみたいと思います。
いったん質問は締めたいと思いますが、またこちらに質問させていただく際には、どうぞよろしくお願いいたします。
No.1
- 回答日時:
JavaScript や XML 周辺で compareString() なる標準関数は(現状)ありませんので、独自関数・システムのお話であればもう少し詳細を説明なさった方が回答がつくと思います。
とにかく、XML を読み込めるブラウザ(メジャー所では IE、Fx、Op、Sa、Ch)なら最低限 XPath 1.0 を使えるはずですので、
・OR 検索例:文字列値が 1 または 2 の HUGA 要素を持つ HOGE 要素
/descendant::HOGE[child::HUGA = "1" or child::HUGA = "2"]
・AND 検索例:文字列値が 1 の HUGA 要素と、3 の GEHO 要素を持つ HOGE 要素
/descendant::HOGE[child::HUGA = "1" and child::GEHO = "3"]
のような XPath 式を作れば良い。そのまま XSLT で HTML 変換するのが手っ取り早いでしょう。
※バックエンドで XQuery でも使えれば一番早いのですけどね。
この回答への補足
丁寧な回答、本当にありがとうございます。XPathを使って検索(AND検索希望)できるのですね。まだよくわかっていないので、調べたいと思います。
私の質問が悪く自分でも混乱してきましたので、おこがましいのですが質問元となったソースをみていただきたく、こちらに書かせていただいています。
xml:
<?xml version="1.0" encoding="shift_jis"?>
<英語>
<色データ>
<番号>1</番号>
<色>赤</色>
<英単語>red</英単語>
</色データ>
<色データ>
<番号>2</番号>
<色>青</色>
<英単語>blue</英単語>
</色データ>
</英語>
***
javascript:
function Search(ky)
{
var obXML = new ActiveXObject('microsoft.XMLDOM');
obXML.async = false;
obXML.load('sampAl.xml');
var Rnode = obXML.documentElement;
var hzn = new ActiveXObject('microsoft.XMLDOM');
var Rhzn = hzn.createElement("英語");
var string = "";
var tx = "";
if(Rnode.hasChildNodes())
{
for(i = 0;i <= Rnode.childNodes.length -1;i++)
{
tx = Rnode.childNodes.item(i).childNodes.item(2).text;
if(compareString(ky.value,tx))
{
Rhzn.appendChild(Rnode.childNodes.item(i));
i = i - 1;
}
}
}
else
{
string += "データなし<br>";
hyouji.innerHTML = string;
return;
}
var sen = hzn.createProcessingInstruction("xml", 'version="1.0"');
hzn.insertBefore(sen, hzn.childNodes.item(0));
hzn.appendChild(Rhzn);
var obXSL = new ActiveXObject('microsoft.XMLDOM');
obXSL.async = false;
obXSL.load("xslt.xsl");
hyouji.innerHTML = hzn.transformNode(obXSL);
}
function compareString(inputky,nodetext)
{
if(inputky == "")
{return false;}
if(inputky == nodetext)
{
return true;
}
else
{
var ofs = nodetext.indexOf(inputky);
if(ofs != -1)
{
return true;
}
return false;
}
}
</script>
以上
***
web上で見つけたソースを参考に作りました。htmlの<form>タグで検索することができます。
検索キーワードに(上記で例えると)「e b」と入力することで、絞込み(AND)検索ができることを目指しています。(キーワードの間はスペースでも、コンマでもなんでも構いません)
情報が足りない場合は再度書き込みたいと思います。
私の理解としては、if(compareString(ky.value,tx)) にて、入力したキーワードとxmlの中を比較し、var ofs = nodetext.indexOf(inputky); で、返していると思っていました・・。
稚拙な質問ですみません・・。どうぞよろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) セルの値をグーグルで検索するエクセルVBAについて! 2 2022/08/01 21:41
- Access(アクセス) Excel や Access のフォームの中でいわゆるインターネットの検索窓のようなものを構築できま 9 2022/05/21 12:39
- Excel(エクセル) エクセルでこのようなことはできますか? 3 2022/07/10 19:57
- その他(開発・運用・管理) 複数のサイトから、同じキーワードの出現の数をとれるサイトを教えてください。 1 2022/07/13 15:42
- Excel(エクセル) VLOOKUPで、検索先が3シートに分かれていて、番号の大小で検索するとエラーになります。 6 2023/07/14 19:09
- au(KDDI) Android Gmail で検索して消す方法 1 2022/11/10 16:10
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- ヤフオク! ヤフオク タイトル 隠し技? 裏技? 1 2023/04/25 06:09
- JavaScript html javascriptにてWeb SQLを操作したい。 2 2022/12/16 17:43
- その他(ブログ) ブログを始めたいと思うのですが、下記のような場合のおすすめブログサービスを教えてください。 収益化な 4 2023/04/10 10:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
google apps scriptの終了のさせ方
-
第3日曜日のみの日付を取得、...
-
javaScript textareaの一行あた...
-
択一形式のテストをつくりたいです
-
分岐処理(アルゴリズム)
-
特定のclassを表示、非表示にする
-
Javascript で可能でしょうか
-
APIを使って埋め込んだグーグル...
-
ASP.NETのコントロールの値をJa...
-
GoogleMap 住所から座標の取得
-
商品コードを入力で、商品名、...
-
javascriptにお詳しい方に質問...
-
アルファベットABCD…をスマート...
-
JavaScriptのindexedDBに格納し...
-
なぜmatchメソッドがエラーにな...
-
ホームページの最終更新日を他...
-
ページ最終行へジャンプする方法
-
GASでGoogleフォームの自動返信...
-
functionから別のfunctionを実...
-
javascriptで自動計算フォーム...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
google apps scriptの終了のさせ方
-
C#OpenCv V4にのエラーに関する...
-
メールフォームの日付入力フォ...
-
GASでundefinedエラーが出ます
-
ジェネレーターの作り方
-
GASでGoogleフォームの自動返信...
-
なぜmatchメソッドがエラーにな...
-
翌月を取得するGASが分かりません
-
ローカルにあるファイルを検索...
-
HTMLで作った時報アプリが動き...
-
ASP.NETのコントロールの値をJa...
-
C# 演算 奇数と偶数 表現の仕方
-
html javascript リンク先アド...
-
gas スプレッドシートがアクテ...
-
javascriptでテーブルに追加し...
-
VSCODE[Python]の設定について
-
JavaScriptで決まった「時刻」...
-
ASP.NET MVCでObjectをjsに渡す
-
イベントが初めの一回しか起き...
-
jqGridについて
おすすめ情報