powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / ajax. XSLT with the DOM
25 сообщений из 51, страница 1 из 3
ajax. XSLT with the DOM
    #34062734
NNika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно асинхронно загрузить данные на страницу и ещё наложить на эти данные шаблон.
Пишу вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" dir="ltr" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<script language="JavaScript">
function submitForm()
	{ 
	      
    	if(window.XMLHttpRequest) 
		  {
		     req = new XMLHttpRequest(); 
		      if (req.overrideMimeType) 
		         {
                             req.overrideMimeType('text/xml');
                             var objXSLT = new ActiveXObject('Microsoft.DOMDocument');
                    }
	        } 
	  
	     else if (window.ActiveXObject)  // IE
			{ 
                    try {
                        req = new ActiveXObject("Microsoft.XMLHTTP");
                   var objXSLT = new ActiveXObject('Microsoft.DOMDocument');
                        }
                     catch (e) {
                        try {
                        req = new ActiveXObject("Microsoft.XMLHTTP");
                         var objXSLT = new ActiveXObject('Microsoft.DOMDocument');
                        } catch (e) {}
                               }
                }
			  if (!req) {
                    alert('Giving up :( Cannot create an XMLHTTP instance');
                    return false;
                         }
                req.onreadystatechange = function()
    		{ 
	           		if(req.readyState ==  4 )
					{
				if(req.status ==  200 )
				{  
                                     var objResTree = document.all['transformedXML'];
		            req.load("http://10.80.26.149/olap/task/otlad.asp");
                                      objXSLT.load("http://10.80.26.149/olap/task/otlad.xslt");
                    // Use the transformNode method to apply the XSLT to the XML.
                                      strResult = req;
                    // Assign the resulting string to the result tree object
                    // innerHTML property.
                                      objResTree.innerHTML = strResult;
                                      return true;
                                                } 
		else	
 		{
					//document.ajax.dyn.value="Error: returned status code " + req.status + " " + req.statusText;
				}	
			} 
		}; 
		//req.open("GET", "http://10.80.26.149/olap/task/otlad.asp", true); 
		//req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
	//	req.send(null); 
	} 

</script>
	</head>
<body>

 <BODY onload='submitForm()'>
<DIV id='transformedXML'></DIV>
</BODY>
</HTML>

    
</body>
</html>

Но что-то ничего не выводится. Первоначально скрипт выглядел вот так: здесь
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #34062875
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не очень понимаю код. что такое ActiveXObject('Microsoft.DOMDocument')?
Код: plaintext
1.
2.
3.
strResult = req;
// Assign the resulting string to the result tree object
// innerHTML property.
objResTree.innerHTML = strResult;
и откуда должен появиться tree object :0
Наверно нужно что-то такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
var objXSLT=new XSLTProcessor();
//или new ActiveXObject("Microsoft.XMLDOM");
objXSLT.load("http://10.80.26.149/olap/task/otlad.xslt");
var xmldoc = req.responseXML;
var fragment = objXSLT.transformToFragment(xmldoc, document);
document.getElementById("transformedXML").innerHTML = "";
document.getElementById("transformedXML").appendChild(fragment);
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #34063313
NNika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я этот пример взяла в MSDN 2005 (XSLT, DOM ( Using XSLT with the DOM from an HTML Page ))
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #34063388
NNika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LINUXERне очень понимаю код. что такое ActiveXObject('Microsoft.DOMDocument')?
Код: plaintext
1.
2.
3.
strResult = req;
// Assign the resulting string to the result tree object
// innerHTML property.
objResTree.innerHTML = strResult;
и откуда должен появиться tree object :0
Наверно нужно что-то такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
var objXSLT=new XSLTProcessor();
//или new ActiveXObject("Microsoft.XMLDOM");
objXSLT.load("http://10.80.26.149/olap/task/otlad.xslt");
var xmldoc = req.responseXML;
var fragment = objXSLT.transformToFragment(xmldoc, document);
document.getElementById("transformedXML").innerHTML = "";
document.getElementById("transformedXML").appendChild(fragment);

Я опечаталась, нужно вместо
Код: plaintext
strResult = req;
написать
Код: plaintext
strResult = req.transformNode(objXSLT);
.
А ('Microsoft.DOMDocument') взяла из примера, точнее скопировала из MSDN.
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #34065351
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NNikaЯ этот пример взяла в MSDN 2005 (XSLT, DOM ( Using XSLT with the DOM from an HTML Page ))
Ну не знаю =) Мой шестой иЕ не признает "Microsoft.DOMDocument"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" dir="ltr" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<script language="JavaScript">
function submitForm()
	{ 
	      
    	if(window.XMLHttpRequest) 
		  {
		     req = new XMLHttpRequest(); 
		      if (req.overrideMimeType) 
		         {
                             req.overrideMimeType('text/xml');
                             var objXSLT = new XSLTProcessor();;
                    }
	        } 
	  
	     else if (window.ActiveXObject)  // IE
			{ 
                    try {
                        req = new ActiveXObject("Microsoft.XMLHTTP");
                   var objXSLT = new XSLTProcessor();
                        }
                     catch (e) {
                        try {
                        req = new ActiveXObject("Microsoft.XMLHTTP");
                         var objXSLT = new ActiveXObject('Microsoft.XMLDOM');
                        } catch (e) {}
                               }
                }
			  if (!req) {
                    alert('Giving up :( Cannot create an XMLHTTP instance');
                    return false;
                         }
                req.onreadystatechange = function()
    		{       
	           		if(true || req.readyState ==  4 )
					{
				if(true || req.status ==  200 )
				{                                      
                                     var objResTree = document.all['transformedXML'];
                                     
                                        objXSLT.load("http://10.80.26.149/olap/task/otlad.xslt");

                                        var xmldoc = req.responseXML;

                                        var res = xmldoc.transformNode(objXSLT);
                                        objResTree.innerHTML = res;
                                      return true;
                                                } 
		else	
 		{
					//document.ajax.dyn.value="Error: returned status code " + req.status + " " + req.statusText;
				}	
			} 
		}; 
		req.open("GET", "http://10.80.26.149/olap/task/otlad.asp", true);
		//req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		req.send(null);
	} 

</script>
	</head>
 <BODY onload='submitForm()'>
<DIV id='transformedXML'></DIV>
</BODY>
</HTML>
В моём ИЕ с моими данными работает так
Опера чего-то ругается не стал разбираться.
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #34065371
NNika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня он выдает ошибку:
Код: plaintext
1.
Данные, необходимые для завершения этой операции ещё не доступны.
А операция вот такая:
Код: plaintext
1.
 var res = xmldoc.transformNode(objXSLT);

Получается, что не создался объект objXSLT?
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #34066873
NNika
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема решается так:
перед
Код: plaintext
1.
 req.load("http://10.80.26.149/olap/task/otlad.asp");
нужно поставить
Код: plaintext
 objXSLT.async = false;
Только почему так?
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #34068049
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что async по умолчанию true. В твоём вариант если данные будут качаться долго, браузер будет висеть и висеть жосско.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
ajax. XSLT with the DOM
    #39311150
Фотография Gabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: javascript
1.
2.
3.
4.
var objXSLT = new XSLTProcessor();
alert(objXSLT);
objXSLT.async = false;
objXSLT.load('xsl/rep_001.xsl');



alert показал что объект создан.
Но далее выходить ошибка:
js:513 Uncaught TypeError: objXSLT.load is not a function

Подскажите пожалуйста, что не правильно делаю ?
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39311261
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используете несуществующую функцию.
вот пример: https://developer.mozilla.org/en-US/docs/Web/XSLT/XSLT_JS_interface_in_Gecko/Basic_Example
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39311304
Фотография Gabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy ,
Я попробовал, но у меня не получается.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
            var xslStylesheet;
            var xsltProcessor = new XSLTProcessor();

            var myXMLHTTPRequest = new XMLHttpRequest();
            myXMLHTTPRequest.open("GET", "xsl/rep_001.xsl", false);
            myXMLHTTPRequest.send(null);

            xslStylesheet = myXMLHTTPRequest.responseXML;
            xsltProcessor.importStylesheet(xslStylesheet);



Uncaught TypeError: Failed to execute 'importStylesheet' on 'XSLTProcessor': parameter 1 is not of type 'Node'.
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39311353
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте
Код: javascript
1.
xsltProcessor.importStylesheet(xslStylesheet.documentElement);
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39311621
Фотография Gabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выдал ошибку:
VM9214:1 Uncaught TypeError: Cannot read property 'documentElement' of null
at <anonymous>:1:45


Скрины прилагает как было выполнено в консоле.
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39311622
Фотография Gabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот содержимое объекта - myXMLHTTPRequest:
В нем вижу что - responseXML пустой.
Не знаю почему так.
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39311696
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное xml по запросу отдается без контент-тайпа text/xml. Попробуйте overrideMimeType как в этом примере: 3280041
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39311837
Фотография Gabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
Вы имели введу заголовок запроса ?

Немного изменил код чтобы передать заголовок запроса:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var myXMLHTTPRequest = new XMLHttpRequest();

myXMLHTTPRequest.open("GET", "xsl/rep_001.xsl", true);
myXMLHTTPRequest.onreadystatechange = function() {
  if (myXMLHTTPRequest.readyState == 4) {
     if(myXMLHTTPRequest.status == 200) {
        console.log(myXMLHTTPRequest);
         }
  }
};
myXMLHTTPRequest.setRequestHeader('Content-Type', 'text/xml')
myXMLHTTPRequest.send(null);


myXMLHTTPRequest.responseXML - по прежнему пустой.

Но ответ приходить не в виде xml:
Код: javascript
1.
myXMLHTTPRequest.getAllResponseHeaders()


"Date: Tue, 20 Sep 2016 08:55:22 GMT
Last-Modified: Tue, 20 Sep 2016 06:41:05 GMT
Server: nginx
ETag: "57e0da01-18f"
Content-Type: application/octet-stream
Access-Control-Allow-Origin: *
Cache-Control: public, no-cache, must-revalidate, proxy-revalidate
Accept-Ranges: bytes
Content-Length: 399
"

Содержимое файла - "xsl/rep_001.xsl", который на стороне back-end:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<body>
<table border="1">
<tr>
<th>Наименование</th>
<th>Значение</th>
</tr>
<xsl:for-each select="doc/row">
  <tr>
  <td><xsl:value-of select="caption"/></td>
  <td><xsl:value-of select="s_value"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39311921
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GabitAntonariy,
Вы имели введу заголовок запроса ?
Код: javascript
1.
myXMLHTTPRequest.setRequestHeader('Content-Type', 'text/xml')


нет, это не поможет.

нажмите ctrl+f и ищите на этой странице упоминание overrideMimeType

GabitНо ответ приходить не в виде xml:

Content-Type: application/octet-streamответ-то в виде xml, но тип содержимого указан другой, а свойство responseXML устанавливается при типе содержимого text/xml
GabitСодержимое файла - "xsl/rep_001.xsl", который на стороне back-end:от него это не зависит.
Если back-end ваш, то при отдаче этого ответа можете указать что-то вроде Response.ContentType = "text/xml" вместо overrideMimeType в скрипте.
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39311956
Фотография Gabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
Back-end мой.
Наверное это надо в nginx настроить ?
Там у меня такая строка для данного типа файла:
Код: nginx
1.
2.
3.
4.
		location ~ ^/(.+\.(xsl|xml))$ {
			alias "c:/.../xsl/$1";
			add_header Cache-Control "public, no-cache, must-revalidate, proxy-revalidate";
			add_header Access-Control-Allow-Origin *;
        }
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39312166
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gabit,

добавьте ещё заголовок
Код: sql
1.
add_header Content-Type text/xml;


а лучше сразу в mime.conf
Код: sql
1.
2.
    text/xml                            xml;
    text/xml                            xsl;
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39312352
Фотография Gabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил, спасибо
Добавил в mime.types:
Код: conf
text/xml                              xml xsl xslt;


Теперь у меня есть - myXMLHTTPRequest.responseXML.
Буду попробовать дальше.
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39312372
Фотография Gabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: javascript
1.
var fragment = xsltProcessor.transformToFragment(xmlDoc, document);


Как можно получить в виде текста данные объекта - fragment ?
Мне надо его вставить в другое окно:
Код: javascript
1.
2.
var new_app=window.open("output.html", "new_app");
new_app.document.write(fragment...);
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39312418
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GabitКак можно получить в виде текста данные объекта - fragment ?
Как вариант...
https://learn.javascript.ru/json
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39312543
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gabit
Код: javascript
1.
var fragment = xsltProcessor.transformToFragment(xmlDoc, document);


Как можно получить в виде текста данные объекта - fragment ?попробуйте fragment.outerXML

а еще попробуйте поставить точку останова и посмотреть в отладчике, какие методы и свойства есть у fragment
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39312588
Фотография Gabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa,
JSON.stringify(); возвращает значение - {}.
...
Рейтинг: 0 / 0
ajax. XSLT with the DOM
    #39312589
Фотография Gabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
myDocfragment.outerXML; - пишет undefined.
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 1 из 3
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / ajax. XSLT with the DOM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]