Форум: "Прочее";
Текущий архив: 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