Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];

Вниз

<![CDATA[<   Найти похожие ветки 

 
VirEx ©   (2006-01-08 21:39) [0]

еще чуть чуть и буду биться головой об стену - перечитал ВСЮ спецификацию XSLT, пробовал различные xsl:output и т.п. с различными атрибутами но... блин, может JavaScript чтоли написать, но ведь это должно решаться проще, полюбому

мне нужно чтобы шаблон (xsl файл) вытащил из xml файла из секции <![CDATA[]]> содержимое, и при этом не изменял его. в этой секции есть html"ьные тэги как например < p >, а шаблон зараза их заменяет на & l t ; p & g t ;

есть примерно вот такой файл с именем 1.xml :
<?xml version="1.0" encoding="iso-8859-1"?>
<main>
<data><![CDATA[<p>текст<p>]]>
</data>
</main>

и шаблон 2.xsl:
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" mlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns="http://www.w3.org/TR/xhtml1/strict">
<xsl:output method ="html" />
<xsl:template match="/">
<xsl:value-of select="//main/data" /> <!-- выдёргиваем строку -->
</xsl:template>
</xsl:stylesheet>

мне нужно чтобы на выходе, при создании html файла, исходный код html файла был бы не & l t ; p & g t ; текст & l t ; / p & g t ; а ИМЕННО <p>текст<p>

я делаю так:

...
uses comobj;
...
var
 XMLDoc,XSLDoc,ResultDoc:Variant;
...

//загружаем документ XML

XMLDoc:=CreateOleObject("Microsoft.XMLDOM");
XMLDoc.async:=false;
XMLDoc.load("1.xml");

//загружаем шаблон XSL
XSLDoc:=CreateOleObject("Microsoft.XMLDOM");
XSLDoc.async:=false;
XSLDoc.Load("2.xsl");

//создание результатирующего документа
ResultDoc:=CreateOleObject("Microsoft.XMLDOM");
ResultDoc.async:=false;
//ResultDoc.validateOnParse := true;// установка проверки разбора

XMLDoc.transformNodeToObject(XSLDoc, ResultDoc);   // разбор XMLDoc по XSL-шаблону
ResultDoc.save("3.html");


при этом создаётся конечный файл 3.html, и он должен содержать < p >текст< p > а не & l t ; p & g t ; текст & l t ; / p & g t ;


 
VirEx ©   (2006-01-08 22:23) [1]

ну что, разве никто не знает?


 
Джо ©   (2006-01-08 22:28) [2]

Вот, а совсем недавно кто-то защищал XML и простоту его использования ;)


 
Kerk ©   (2006-01-08 22:30) [3]

VirEx ©   (08.01.06 21:39)
мне нужно чтобы на выходе, при создании html файла, исходный код html файла был бы не & l t ; p & g t ; текст & l t ; / p & g t ; а ИМЕННО <p>текст<p>


Врядли это возможно. Потому что это делать ни в коем случае нельзя.


 
VirEx ©   (2006-01-08 22:34) [4]


>  [2] Джо ©   (08.01.06 22:28)
> Вот, а совсем недавно кто-то защищал XML и простоту его
> использования ;)

знаю знаю, грешен :) но мою тупость еще никто не отменял :)


 
nene   (2006-01-08 22:40) [5]

А если попробовать писать в CDATA вместо <> - < и > или непоср. шестнадцатиричный код этих символов?


 
VirEx ©   (2006-01-08 22:51) [6]


>  [5] nene   (08.01.06 22:40)

дело в том что XML файл я получаю от незнакомых мне дяденек :) ну всмысле качаю с инета а дальше уже обрабатываю как хочу :)


 
Kerk ©   (2006-01-08 22:52) [7]

VirEx ©   (08.01.06 22:51) [6]
дело в том что XML файл я получаю от незнакомых мне дяденек :)


Никогда не разговаривай с незнакомцами!


 
nene   (2006-01-08 23:06) [8]

Еще возможно стоит покопать в сторону disable-output-escaping.


 
VirEx ©   (2006-01-08 23:16) [9]


>  [8] nene   (08.01.06 23:06)
> Еще возможно стоит покопать в сторону disable-output-escaping.

копал


 
Piter ©   (2006-01-08 23:33) [10]

Удалено модератором


 
Kerk ©   (2006-01-08 23:36) [11]

Удалено модератором


 
Piter ©   (2006-01-09 00:08) [12]

Удалено модератором


 
McSimm ©   (2006-01-09 00:18) [13]

Когда архивы форума на XML переделывал, помниться, побился я в этом направлении, но ничего так и не добился.
Отказался от CDATA.
А чтобы "незнакомые дяденьки" в своих форумных сообщениях сильно не портили валидность XML приходится программно кое-как подгонять вложенность и очередность тегов форматирования.
Правда не очень это устраивает, поэтому если вдруг придумаешь как победить CDATA - поделись :)


 
Kerk ©   (2006-01-09 00:39) [14]

Удалено модератором


 
Ломброзо ©   (2006-01-09 00:53) [15]

в FAQ
----
<xsl:text disable-output-escaping="yes"><![CDATA[<>&]]></xsl:text>


 
Piter ©   (2006-01-09 01:00) [16]

Удалено модератором
Примечание: не надоело ?


 
McSimm ©   (2006-01-09 01:06) [17]


> Ломброзо ©   (09.01.06 00:53) [15]

Спасибо, очень помогли.


 
McSimm ©   (2006-01-09 01:09) [18]

автору - для вашего примера это выглядит (и работает):

<xsl:value-of select="//main/data" disable-output-escaping="yes"/> <!-- выдёргиваем строку -->


 
VirEx ©   (2006-01-09 10:00) [19]

не канает!

если 1.XML сделать так:
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml:stylesheet type="text/xsl" href="2.xsl" ?>
<main>
<data><![CDATA[<p>текст<p>]]>
</data>
</main>

а шаблон 2.XSL так:
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" mlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns="http://www.w3.org/TR/xhtml1/strict">
<xsl:output method ="html" />
<xsl:template match="/">
<xsl:value-of select="//main/data" disable-output-escaping="yes"/> <!-- выдёргиваем строку -->
</xsl:template>
</xsl:stylesheet>

и запустить его двумя кликами то всё будет ОК

но ведь на входе 1.XML такой строки нет (спец. выделенная), ну не делать же варварским способом - вставлять туда строку, сохранять и запускать этот 1.XML файл, мне нужно чтобы можно было программно применить шаблон к исходному (1.XML) файлу, а в вышеприведенном примере если сделать программно то получается пустой 3.HTML, но стоит только убрать атрибут disable-output-escaping, или же сделать его значение как no (видимо он такой по умолчанию) то опять всё насмарку.

как правильно сделать шаблон?


 
VirEx ©   (2006-01-09 10:05) [20]


> и запустить его двумя кликами то всё будет ОК

его всмысле 1.XML


 
Ломброзо ©   (2006-01-09 12:38) [21]

VirEx ©   (09.01.06 10:00) [19]

Да ну заблуждение какое-то. IE и ваш код используют один и тот же парсер, поэтому результаты трансформации должны быть идентичными, независимо от того, скармливается ли XSL-процессору шаблон из внешнего источника (<?xml:stylesheet type="text/xsl" href="2.xsl" ?>), либо же явно производится вызов IXMLDOMDocument.Transform()

Всё работает.

* * * Test.vbs

Set pXML = CreateObject("MSXML2.DomDocument")
pXML.LoadXML "<?xml version="1.0" encoding="iso-8859-1"?><main><data><![CDATA[<p>текст<p>]]></data></main>"

Set pXSL = CreateObject("MSXML2.DomDocument")
pXSL.LoadXML "<?xml version="1.0" encoding="windows-1251"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns="http://www.w3.org/TR/xhtml1/strict">" & _
"<xsl:output method ="html" /><xsl:template match="/"><xsl:value-of select="//main/data" disable-output-escaping="yes"/></xsl:template></xsl:stylesheet>"

MsgBox pXML.TransformNode(pXSL)


 
VirEx ©   (2006-01-09 14:57) [22]

XMLDoc.transformNodeToObject(XSLDoc, ResultDoc);   // разбор XMLDoc по XSL-шаблону
ResultDoc.save("3.html");

этот метод не помогает, пришлось делать по варварски:

procedure TForm1.Button1Click(Sender: TObject);
var
XMLDoc,XSLDoc:Variant;
f:TextFile;
begin

//загружаем документ XML
XMLDoc:=CreateOleObject("MSXML2.DomDocument");
XMLDoc.async:=false;
XMLDoc.load("news.xml");

//загружаем шаблон XSL
XSLDoc:=CreateOleObject("MSXML2.DomDocument");
XSLDoc.async:=false;
XSLDoc.Load("news.xsl");

 AssignFile(а, "3.html");
 rewrite(f);
 Append(f);
 WriteLn(f,string(XMLDoc.transformNode(XSLDoc)));
 CloseFile(f);

end;


 
Ломброзо ©   (2006-01-09 16:52) [23]

кажется, я понял. При помощи TransformNodeToObject вы пишете результат трансформации в другой XmlDocument. Мне кажется, что если результатом трансформации является строка, не содержащая well-formed XML, то парсер этот ошибочный текст схавает молча и на выходе отдаст пустой документ. А у вас результирующий текст и не содержит well-formed Xml, хотя бы потому, что тэг <p> не закрыт:

<data><![CDATA[<p>текст<p>]]>
</data>


а трансформацию вы производите в html:
<xsl:output method ="html" />

Поэкспериментрируйте. Либо в xsl явно укажите, что трансформировать надо в XML:
<xsl:output method ="xml" />

либо производите вывод трансформации не в XmlDocument, а в экземпляр объекта, поддерживающего IStream, например, в ADODB.Stream.


 
VirEx ©   (2006-01-09 17:08) [24]


>  [23] Ломброзо ©   (09.01.06 16:52)

насчет TransformNodeToObject вы правильно поняли, и с <p>текст</p> тоже работает, только это пример так сказать из "тепличных условий" а rss файл загруженный с сайта всёравно не обрабатывается, так что оставлю своё "некрасивое" решение...


> либо производите вывод трансформации не в XmlDocument, а
> в экземпляр объекта, поддерживающего IStream, например,
> в ADODB.Stream.

это я трогать не хочу - мне бы поменьше кода, я пишу плагин для WinConsul, хотя только что уже его опубликовал, так что чем меньше в uses тем лучше, ведь для меня и 60 Кб уже много будет, т.е. для моего проекта :)



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.049 c
2-1136976284
Новичек
2006-01-11 13:44
2006.01.29
Наименьшее значение Handle.


4-1132069000
Comp
2005-11-15 18:36
2006.01.29
имя пользователя и пароль к инету


2-1137321045
Tonich
2006-01-15 13:30
2006.01.29
Число знаков


2-1136725283
VeB
2006-01-08 16:01
2006.01.29
HTML ссылка


15-1136313078
Nous Mellon_
2006-01-03 21:31
2006.01.29
Бездельничаю. Забава на смекалку.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский