parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Забавная ситуация: xdoc с дувмя корневыми элементами

Вячеслав 01.06.2006 10:43

Как известно, при xsl-трансформациях на выходе не обязательно должен быть корректный xml, вполне возможно, что это будет и простой текст без каких-либо тегов.

Так вот по-неосторожности в своем xsl я забыл написать шаблон для корневого элемента, и результирующее дерево получилось несколькими корневыми элементами. Раньше я об этом как-то не задумывался, да и сейчас бы не обратил внимания, ведь метод ^doc.string[] работает всегда безотказно.

Но в целях отладки, да и просто из чисто эстетических побуждений я прогоняю оттрансформированные xml еще раз через xsl для их красивого вывода (ну не нравиться мне, что и IE, и FF показывают text/xml не моноширинным шрифтом).

И каково же было мое удивление, когда некорректный xml (с двумя корневыми элементами) без каки-либо ошибок прошел трансформацию, даже не выругавшись!

Вот небольшая сводка об этом чудо-явлении:
#здесь в результате трансформации будет xml с двумя корневыми node'ами
#сейчас нет времени заморачиваться, но еще интереснее ситуация, когда transform вернет текст вообще без тегов ))
$out_doc[^doc.transform[$xsl]]
^if($out_doc.nodeType == $xdoc:DOCUMENT_NODE){да, да вы не ошиблись}
$nodeset[^out_doc.select[/node]]
Количество корневых элементов в документе: ^nodeset._count[]
В принципе, не так уж и страшно, но по-хорошему было бы правильнее, если бы метод transform возвращал или xdoc или string, в зависимости от того, well-formed xml или нет. Чувствую, что парсер тут совсем не причем, а дело в libxml/xsl.

С другой стороны, если в какой-нибудь новой свецификации xslt будет возможность в <xsl:template match=""> указать не только xpath-маску, а какой-нибудь pattern для строк, как это можно в других функциональных языках, ну или, допустим, regexp, то фича прогнать через xsl простой текст моему сердцу будет очень даже мила. Конечно, этот последний абзац несколько фантастичен, просто я тут недавно заботал colorer, тот что используется в FAR'е, отсюда такие вот размышления.