результат XSLT без кодировки
От: glina Беларусь www.offsiteteam.com
Дата: 09.12.03 15:03
Оценка:
В результате трансформации документа (transformNode), результирующий XML в заголовке имеет

<?xml version="1.0"?>

т.е. не указана кодировка (сама кодировка правильная), в исходном файле и в XSL я использую "windows-1251", в XSL прописано

<xsl:output method="xml" version="1.0" encoding="windows-1251" indent="yes"/>

можно ли получить результат с указанием в заголовке XML кодировки "windows-1251" ???
Re: результат XSLT без кодировки
От: achp  
Дата: 09.12.03 15:10
Оценка:
Здравствуйте, glina, Вы писали:

G>В результате трансформации документа (transformNode)


Какой XSLT-процессор?
Да здравствует ИМХО!
Re[2]: результат XSLT без кодировки
От: glina Беларусь www.offsiteteam.com
Дата: 09.12.03 15:16
Оценка:
Здравствуйте, achp, Вы писали:

G>>В результате трансформации документа (transformNode)


A>Какой XSLT-процессор?


MSXML4 SP2 (а вот XMLSpy показывает кодировку )
Re[3]: результат XSLT без кодировки
От: achp  
Дата: 09.12.03 15:25
Оценка:
Здравствуйте, glina, Вы писали:

G>MSXML4 SP2 (а вот XMLSpy показывает кодировку )


Тебя кто-то ввел в заблужение. Метод transformNode возвращает строку типа BSTR в соответствии со своим прототипом. Эта строка по самому определению BSTR — в кодировке UTF-16 (а никак не Windows-1251). Поэтому кодировка и не проставляется.

То, что тебе нужно — метод transformNodeToObject.
Да здравствует ИМХО!
Re[4]: результат XSLT без кодировки
От: glina Беларусь www.offsiteteam.com
Дата: 10.12.03 09:36
Оценка:
Здравствуйте, achp, Вы писали:

A>То, что тебе нужно — метод transformNodeToObject.


заменил

sResult = (LPCWSTR)pXMLDoc->transformNode(pXSL->documentElement);


таким вот кодом

IXMLDOMDocumentPtr pResult;
CComPtr<IDispatch> pDisp;
hr = pResult.CreateInstance("MSXML2.DOMDocument.4.0");
hr = pResult.QueryInterface(IID_IDispatch, (void **)&pDisp);
_variant_t vObj;
vObj.vt = VT_DISPATCH;
vObj.pdispVal = pDisp;

hr = pXMLDoc->transformNodeToObject(pXSL->documentElement, vObj);
sResult = (LPCWSTR)pResult->xml;


кодировка не появилась
Re[5]: результат XSLT без кодировки
От: achp  
Дата: 10.12.03 09:57
Оценка:
Здравствуйте, glina, Вы писали:

G>кодировка не появилась


OK. Ты вывел результат преобразования в дерево. Но в самом дереве кодировка не нужна, там всегда используется UTF-16. Кодировка нужна тогда, когда ты выводишь это дело в байтовый поток.

Когда ты вызываешь метод save, он анализирует дерево и ищет в нем сигнатуру XML, замаскированную под инструкцию обработки (processing instruction) вида <?xml version="1.0" encoding="UTF-1251"?>, перед корневым элементом.

Если там указана кодировка, он принимает ее к исполнению и пишет байтовый поток в этой кодировке. Если узел инстукции обработки не найден или в нем нет указания о кодировке, он берет умолчание. В любом случае сигнатура XML попадает в вывод в том же виде.

Эту инструкцию обработки туда несложно добавить. Как это сделать, ищи на сайте.

Если бы ты выводил результат преобрабования не в дерево, а сразу в IStream, XSLT-процессор принял бы к исполнению инструкцию <xsl:output>.
Да здравствует ИМХО!
Re[6]: результат XSLT без кодировки
От: glina Беларусь www.offsiteteam.com
Дата: 15.12.03 08:46
Оценка:
Здравствуйте, achp, Вы писали:

A>Если бы ты выводил результат преобрабования не в дерево, а сразу в IStream, XSLT-процессор принял бы к исполнению инструкцию <xsl:output>.


Т.е. к коду в предыдущем посте

hr = pResult.CreateInstance("MSXML2.DOMDocument.4.0");
hr = pResult.QueryInterface(IID_IDispatch, (void **)&pDisp);
_variant_t vObj;
vObj.vt = VT_DISPATCH;
vObj.pdispVal = pDisp;
hr = pXMLDoc->transformNodeToObject(pXSL->documentElement, vObj);


надо добавить

hr = pResult->QueryInterface(&pStream);
hr = pStream->Read((void*)pszBuf, dwBufSize, &ulBytesRead);


или можно покороче ???
Re[7]: результат XSLT без кодировки
От: achp  
Дата: 15.12.03 09:06
Оценка:
Здравствуйте, glina, Вы писали:

G>Здравствуйте, achp, Вы писали:


A>>Если бы ты выводил результат преобрабования не в дерево, а сразу в IStream, XSLT-процессор принял бы к исполнению инструкцию <xsl:output>.


G>Т.е. к коду в предыдущем посте


G>надо добавить


G>
G>hr = pResult->QueryInterface(&pStream);
G>hr = pStream->Read((void*)pszBuf, dwBufSize, &ulBytesRead);
G>


G>или можно покороче ???


Нет, это вообще не то!

Ты в метод transformNodeToObject передаешь некоторый объект. Метод смотрит, что из себя этот объект представляет, вызывая для него QueryInterface: сначала он проверяет, не является ли объект документом XML DOM, и, если это так, строит в этом объекте DOM-дерево получаемого документа; если нет, то он смотрит, не поддерживает ли объект "на худой конец" интерфейс IStream, и, если так, то выводит представление итогового документа в этот объект, как поток байтов.

То есть, ты можешь туда передать не объект-документ XML DOM, а какой-то свой объект, реализующий IStream.
Да здравствует ИМХО!
Re[8]: результат XSLT без кодировки
От: glina Беларусь www.offsiteteam.com
Дата: 15.12.03 12:14
Оценка:
Здравствуйте, achp, Вы писали:

A>Нет, это вообще не то!


A>Ты в метод transformNodeToObject передаешь некоторый объект. Метод смотрит, что из себя этот объект представляет, вызывая для него QueryInterface: сначала он проверяет, не является ли объект документом XML DOM, и, если это так, строит в этом объекте DOM-дерево получаемого документа; если нет, то он смотрит, не поддерживает ли объект "на худой конец" интерфейс IStream, и, если так, то выводит представление итогового документа в этот объект, как поток байтов.


A>То есть, ты можешь туда передать не объект-документ XML DOM, а какой-то свой объект, реализующий IStream.


IStreamPtr pStream;
hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);
_variant_t vObj;
vObj.vt = VT_DISPATCH;
vObj.pdispVal = (IDispatch*)pStream.GetInterfacePtr();
hr = pXMLDoc->transformNodeToObject(pXSL->documentElement, vObj);


такой вот код мусор в стриме возвращает, что я не так понял/сделал
Re[9]: результат XSLT без кодировки
От: glina Беларусь www.offsiteteam.com
Дата: 15.12.03 12:48
Оценка:
G>такой вот код мусор в стриме возвращает, что я не так понял/сделал

лоханулся, сори ...
всё работает, только нужно стрим поSeek'ать в начало
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.