Funderar på hur jag enklast markerar ett ord i en xml fil.
Jag kan enkelt skicka med ordet i querysträngen, t.ex sidan.xml?highlight=Ordet
Men hur gör jag sen enklast. Javascript i XSL-filen?
Highlight på ord i en xml fil
2 svar · 435 visningar · startad av Pedda
Problemet löste sig efter mycket slit. :)
Kom på att någon annan kan ha nytta av koden, så här är den.
markup.js
// plocka ut sökordet ur querysträngen
loc = location.search,
searchWord = (loc.indexOf("h")>0)?loc.split("?h=")[1]:null;
// kontrollera webbläsare
var ns4 = (document.layers);
var ie4 = (document.all && !document.getElementById);
var ie5 = (document.all && document.getElementById);
var ns6 = (!document.all && document.getElementById);
// kontrollera så vi har ett sökord
if(searchWord == null || searchWord == "") {
}
else {
searchDOMTree(searchWord);
}
// loopa igenom elementen i xml filen
function searchDOMTree(myWord) {
a = document.getElementsByTagName("*");
traverseDOMTree(a[0], myWord);
}
function traverseDOMTree(currentElement, myWord){
if (currentElement){
var j;
var tagName = currentElement.tagName;
// Skriver nodernas tagName som <A>, <IMG>, etc
if (tagName){
}
else {
// Greppa sökordet
var myQuery = myWord;
// Om längden på nodeValue är större än 1 så finns det text
if(currentElement.nodeValue.length > 1){
// Splitta nodeValue med myQuery som avgränsare
// Nu case sensitive!
var myOfset = 1;
var myWordsArray = myStringsArray = new Array();
var sSring = currentElement.nodeValue;
var tWord = myWord;
if(sSring.toUpperCase().match(tWord.toUpperCase())){
// Init Reg exp stuff
var re = new RegExp(tWord,"i");
var myOfset = sSring.search(re);
var re = new RegExp(tWord,"ig");
var myWordsArray = sSring.match(re);
var myStringsArray = sSring.split(re);
var re = new RegExp("\n","g"); // ny rad
var sSring = sSring.replace(re,"");
var re = new RegExp("\f","g"); // form feed
var sSring = sSring.replace(re,"");
var re = new RegExp("\r","g"); // carriage return
var sSring = sSring.replace(re,"");
//
// Temporära element och strängar
var begCaseF = false;
var textBefore = "";
var textAfter = "";
var myParentElement = currentElement.parentNode;
var myCurrentElementEmptyClone = currentElement.cloneNode(false); // #Text
var myParentElementEmptyClone = document.createElement("span"); // Används som container
if(ie5){
if((sSring.indexOf(myWordsArray[0],0))==0){
// Det finns ingen text före ordet
// är i första positionen.
var begCaseF = true;
}
else {
textBefore = myStringsArray[0];
var textBefore_content = document.createTextNode(textBefore);
myParentElementEmptyClone.appendChild(textBefore_content);
}
}
if(ns6){
textBefore = myStringsArray[0];
var textBefore_content = document.createTextNode(textBefore);
myParentElementEmptyClone.appendChild(textBefore_content);
}
var si = 1;
for(x = 0; x < myWordsArray.length; x++){
// 1. Nytt element
var newElement = document.createElement("span");
newElement.className = "markup";
// 2. Lägg till ordet
var newElement_content = document.createTextNode(myWordsArray[x]);
newElement.appendChild(newElement_content);
myParentElementEmptyClone.appendChild(newElement);
// Texten efter
if(begCaseF){
textAfter = myStringsArray[x];
}
if(myStringsArray[si] != undefined){
textAfter = myStringsArray[si];
}
if(textAfter != undefined){
var textAfter_content = document.createTextNode(textAfter);
myParentElementEmptyClone.appendChild(textAfter_content);
}
}
myParentElement.replaceChild(myParentElementEmptyClone,currentElement);
}
}
}
// Gå igenom trädstrukturen
var i=0;
var currentElementChild=currentElement.childNodes[i];
while (currentElementChild){
// Gå igenom trädstrukturen rekursivt på child noderna
traverseDOMTree(currentElementChild,myWord);
i++;
currentElementChild=currentElement.childNodes[i];
}
}
}