Измените тег <br> на <?linebreak?> с помощью tcl tdom

У меня есть входная строка в формате html, которую необходимо проанализировать и записать в XML, совместимый с DITA.

Вход:

<p>Line with following newline<br>Line with two following newlines<br><br>Line with no following newline</p>

Желаемый результат:

<p>Line with following newline<?linebreak?>Line with two following newlines<?linebreak?><?linebreak?>Line with no following newline</p>

package require tdom

set xml {<p>Line with following newline<br>Line with two following newlines<br><br>Line with no following newline</p>}

puts "Input:"
puts "$xml"

set doc [dom parse -html -keepEmpties $xml]
set root [$doc documentElement]

foreach node [$root getElementsByTagName br] {
    $node delete
    #$node appendXML "<?linebreak?>"

}

puts "Output:"
puts [$doc asXML -indent none]

Если я раскомментирую #$node appendXML "<?linebreak?>", скрипт завершится неудачно. Я новичок в tdom, но не в tcl. Или....может быть, у кого-то есть другое представление о том, как сохранить разрывы строк в XML, особенно в DITA.

Если вы планируете позже перевести свой дита-контент, я рекомендую протестировать обработку PI разрыва строки вашим инструментом CAT/TM.

Stefan Jung 21.06.2024 01:31
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
1
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как только вы вызываете delete на узле tdom, он больше не существует, поэтому, естественно, вы получите ошибку, если попытаетесь использовать его позже.

Один из подходов: для каждого узла br создайте новый узел инструкций обработки, а затем замените им узел br (для этого сначала необходимо получить родительский узел узла). Тогда ваш цикл будет выглядеть так:

foreach node [$root getElementsByTagName br] {
    set lb [$doc createProcessingInstruction linebreak ""]
    [$node parentNode] replaceChild $lb $node
    # replaceChild moves the old node to the document fragment list;
    # just get rid of it completely since we're not going to reuse it
    $node delete
}

и модифицированная программа распечатает

Input:
<p>Line with following newline<br>Line with two following newlines<br><br>Line with no following newline</p>
Output:
<html><p>Line with following newline<?linebreak ?>Line with two following newlines<?linebreak ?><?linebreak ?>Line with no following newline</p></html>

Ах... идеально! Это имеет смысл, включая использование createProcessingInstruction. Спасибо за вашу помощь.

user32089 21.06.2024 03:05

Другие вопросы по теме