2013-03-02 4 views
3

Я хочу преобразовать XML-документ в HTML с помощью XSL, немного поработать с ним, а затем визуализировать его. Это, по сути, что я делаю:Кастинг a Nokogiri :: XML :: Документ к Nokogiri :: HTML :: Документ

source = Nokogiri::XML(File.read 'source.xml') 
xsl = Nokogiri::XSLT(File.read 'transform.xsl') 
transformed = xsl.transform(source) 
html = Nokogiri::HTML(transformed.to_html) 
html.title = 'Something computed' 

Stylesheet::transform всегда возвращает XML::Document, но мне нужно HTML::Document экземпляр использовать методы как title=.

Приведенный выше код работает, но экспорт и повторный анализ как HTML просто ужасный. Поскольку цель является подклассом источника, должен быть более эффективный способ выполнения преобразования.

Как я могу очистить этот беспорядок?

В качестве побочного вопроса, Nokogiri, как правило, подталкивал меня к обращению с доктринами, неосознанностью <meta charset= и т. Д. ... знает ли кто-нибудь о менее автоматической магии с подобными возможностями?

Большое спасибо;)

+1

Поскольку 'HTML :: Document' является подклассом' XML :: Document', не похоже, что есть механизм для преобразования. Однако, если вы посмотрите на специальные методы HTML, такие как 'title', они обычно являются просто селекторами, такими как' title = at ('title') и title.inner_text'. Не знаете, сколько других HTML-методов вам нужно. – GSP

+1

@GSP в балансе, даже эта ужасная форма литья стоит для HTML-методов. Я подозреваю, что экземпляр HTML-документа также более полезен для выборочного представления нулевых элементов, таких как 'br' и' meta'. Я первоначально задал заголовок, используя 'css ('head> title')', но я твердо убежден, что если кто-то уже написал что-то хорошее, вы не должны писать его снова :) –

+1

В 'title' ничего особенного нет. или любой помощник HTML, подобный этому в Nokogiri, что вы не можете безопасно реплицировать самостоятельно в контексте XML-документа. Или используйте 'Nokogiri :: Slop (doc_to_parse)' или 'Nokogiri :: XML (doc_to_parse) .slop!' И пусть это сделает для вас работу. –

ответ

0

HTML::Document расширяет XML::Document, но отдельные узлы в HTML-документе, являются просто XML::Nodes, т.е. их нет HTML::Nodes. Это предполагает способ преобразования документа XML в HTML, создавая новый пустой HTML::Document и установив его root в том, что из документа XML:

html = Nokogiri::HTML::Document.new 
html.root= transformed.root 

Новый документ имеет методы HTML, как title= и meta_encoding= доступны, и когда сериализация создает HTML-документ, а не HTML: добавляет HTML-тип документа, правильно использует пустые теги, такие как <br>, при необходимости отображает минимизированные атрибуты (например, <input type="checkbox" selected>) и не избегает таких вещей, как > в блоках <script>.

Смежные вопросы