Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

<![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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.054 c
2-1137161329
Serjhh
2006-01-13 17:08
2006.01.29
Rave5


2-1136810258
BiggieSmalls
2006-01-09 15:37
2006.01.29
И еще немного реестра


2-1136976284
Новичек
2006-01-11 13:44
2006.01.29
Наименьшее значение Handle.


15-1136785963
begin...end
2006-01-09 08:52
2006.01.29
С Днём рождения! 9 января


1-1133945910
Мастер Ломастер
2005-12-07 11:58
2006.01.29
Символ в нижнем или верхнем индексе?