質問: javascriptで複数キーワード検索したい。 xmlでデータベースを作り、javascriptで検索、htmlで表示させていますが、一単語しか受け付けません(comparestringで検索させているためだと思います)。 yahooやgoogleのように複数単語を受け付けるようにしたいです。 複数キーワードをスペース区切りなどで入れ、and検索できるようにするにはどうしたらいいでしょうか。 参考サイトや助言などご教授いただきたく、よろしくお願いいたします。
回答: no.1 補足より。ずいぶん古いサンプルコードですが、ie5.5+ で動けば良いのですね? 他のブラウザは考慮外で、ウェブ上ではなく手元で動けば十分なのですね? ならば、次のようなフォームがあるとして(載っていないのでこちらで作りました)、 検索 次のように 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>'; return; } if (keywordstring.indexof ('"') > -1) { contextnode.innerhtml = '検索語に二重引用符を含めないで下さい。<\/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>'; 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>'; 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>'; 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; } }